《JavaScript高級程序設計》中“創(chuàng)建對象”的的歸納,只為方便對比而已
一、工廠模式
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")
優(yōu)點:解決了創(chuàng)建多個相似對象的問題
缺點:無法解決對象識別問題
二、構造函數(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")
// 當作構造函數(shù)使用
var person = new Person("Greg", 27, "Doctor")
person.sayName() // Greg
// 當作普通函數(shù)調用
Person("Greg", 27, "Doctor")
window.sayName() // Greg
// 在另一個對象的作用域中調用
var o = new Object()
Person.call(o, "Kristen", 25, "Nurse")
o.sayName() // Kristen
優(yōu)點:創(chuàng)建自定義的構造函數(shù)意味著將來可以將它的實例標識為一種特定的類型
缺點:每個方法都要在每個實例上重新創(chuàng)建一遍
三、原型模式
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
優(yōu)點:讓所有對象實例共享它所包含的屬性和方法
四挣菲、組合使用構造函數(shù)模式和原型模式
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.friends = ["Shelby", "Court"]
}
Person.prototype = {
constructor: Person,
sayName: function() {
alert(this.name);
}
}
PS:使用最廣泛、認同度最高的一種創(chuàng)建自定義類型的方法掷邦“渍停可以說這是用來定義類型引用的一種默認模式。
五抚岗、動態(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);
}
}
}
六宣蔚、寄生構造函數(shù)模式
創(chuàng)建一個函數(shù)向抢,該函數(shù)的作用僅僅是封裝創(chuàng)建對象的代碼,然后在返回新創(chuàng)建的對象件已。跟工廠模式一模一樣
function SpecialArray() {
var values = new Array();
values.push.apply(values, arguments);
values.toPipedString = function() {
return this.join("|");
}
return values;
}
var colors = new SpecialArray("red", "blue", "green");
alert(colors.toPipedString());
- 返回的對象與構造函數(shù)或者與構造函數(shù)的原型屬性之間沒有關系笋额,也就是說,構造函數(shù)返回的對象與在狗仔函數(shù)外部創(chuàng)建的對象沒有什么不同篷扩。
- 不能依賴instanceof操作符來確定對象類型。
七茉盏、穩(wěn)妥構造函數(shù)模式
沒有公共屬性鉴未,而且其方法也并不引用this的對象
function Person(name, age, job) {
var o = new Object()
o.sayName = function() {
alert(name);
}
return o;
}