一玄妈、工廠模式
function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = createPerson("Nicholas", 29, "Software Engineer");
var person2 = createPerson("Greg", 27, "Doctor");
可以無數(shù)次調(diào)用上面這個函數(shù)醉鳖,解決創(chuàng)建多個相似對象的問題旋恼,但是沒有解決對象識別的問題(即怎樣知道一個對象的類型)
二昼牛、構(gòu)造函數(shù)模式
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
person1 和 person2 是兩個不同的實例泛鸟,但是它們的 constructor(構(gòu)造函數(shù))s屬性都指向 Person蝠咆。
alert(person1.constructor == Person); //true
alert(person2.constructor == Person); //true
三、原型模式
function Person() {}
Person.prototype.name = "Nicholas";
Person.prototype.age= 29;
Person.prototype.job= "Software Engineer";
Person.prototype.sayName= function(){
alert(this.name);
};
var person1 = new Person();
person1.sayName(); //"Nicholas"
var person2 = new Person();
person2.sayName(); //"Nicholas"
alert(person1.sayName == person2.sayName); //true
(1)驗證構(gòu)造函數(shù) Person 的 prototype 是否是 person1 對象的原型
Person.prototype.isPrototypeOf(person1) //true
(2)Object.getPrototypeOf() 返回 [[Prototype]] 的值
Object.getPrototypeOf(person1)
(3)完全刪除實例屬性
delete person1.name;
(4)檢測一個屬性是否存在于實例中,若存在刚操,返回 true
person1.hasOwnProperty("name")
(5)in 操作符
"name" in person1
在通過對象能夠訪問給定屬性時返回 true闸翅,無論該屬性存在于實例中還是原型中。
同時使用 hasOwnProperty() 和 in 菊霜,就可以確定該屬性是存在于對象中坚冀,還是存在于原型中:
function hasPrototypeProperty(object, name) {
return !object.hasOwnProperty(name) && (name in object);
}
(6)for - in,返回的是所有能夠通過對象訪問的鉴逞、可枚舉的屬性记某,無論是實例還是原型中的。
(7)Object.keys(對象) 返回對象上所有可枚舉的實例屬性
(8)Object.getOwnPropertyNames() 返回所有實例屬性构捡,無論是否可枚舉
(9)使用下面的方式重設(shè) constructor 屬性會導(dǎo)致它的 [[Enumerable]]被設(shè)置為true液南,默認情況下,原生的 constructor 屬性是不可枚舉的勾徽。
可以使用 Object.defineProperty()
四滑凉、組合使用構(gòu)造函數(shù)模式和原型模式
五、動態(tài)原型模式
function Person(name, age, job) {
//屬性
this.name = name;
this.age = age;
this.job = job;
//方法
if (typeof this.sayName != "function") {
Person.prototype.sayName = function(){
alert(this.name);
};
}
}
六喘帚、寄生構(gòu)造函數(shù)模式
七畅姊、穩(wěn)妥構(gòu)造函數(shù)模式