js的構(gòu)造函數(shù)和其他語言一樣是用來初始化對象的,但是有一點不同js中任何函數(shù)都可以作為構(gòu)造函數(shù),只要用new 去調(diào)用都會生成一個新的對象.但是為了方便區(qū)別一般js中構(gòu)造函數(shù)的首字母都會大寫.
js中有幾種不同的構(gòu)造函數(shù).
1.動態(tài)原型模式:
function Persion(){
this.name = 'lsh';
if (!this.sayName){
Persion.prototype.sayName = function (){
console.log(this.name);
}
}
}
var p = new Persion();
p.sayName();
這種方式可以在構(gòu)造函數(shù)內(nèi)部檢查你需要添加的原型是否存在來決定是否添加原型方法或?qū)傩?/p>
2.寄生構(gòu)造函數(shù):
function Person (){
let obj = new Object();
obj.name = 'lsh';
obj.sayName = function(){
console.log(this.name);
}
return obj;
}
var p = new Person();
p.sayName();
這種方式采用在構(gòu)造函數(shù)內(nèi)部生成一個新的對象,但是同時衍生了一個問題就是返回的對象跟構(gòu)造函數(shù)其實是沒有關系的,無法使用 instanceof 檢測對象類型,所以不推薦使用.
3.穩(wěn)妥構(gòu)造函數(shù):
function Person(name,age){
let obj = new Object();
this.age = age;
obj.sayName = function(){
console.log(name+age);
}
return obj;
}
var p = new Person('lsh',24);
p.sayName();
這種構(gòu)造函數(shù)跟寄生構(gòu)造函數(shù)有一點類似,采用在構(gòu)造函數(shù)內(nèi)部再生成一個對象,但是穩(wěn)妥構(gòu)造函數(shù)生成的對象,只能調(diào)用你暴露出來的接口,例如name 只能通過sayName函數(shù)去訪問,還有age相當于一個私有屬性.同時穩(wěn)妥構(gòu)造函數(shù)也是不能使用instanceof來檢查類型的,原因同寄生構(gòu)造函數(shù)一樣.