1 工廠模式
1.1 創(chuàng)建
function createFruit(name,colors) {
var o = new Object();
o.name = name;
o.colors = colors;
o.getInfo = function () {
console.log(this.name+"是"+this.colors+"的");
}
return o;
}
var apple = createFruit("蘋果",["紅色","黃色"]);
1.2 說明
利用水果工廠可以很容易的創(chuàng)建一種新的水果,每個新創(chuàng)建的水果都是包括兩個屬性和一個方法的Object。因為沒有水果對象产徊,所以不能通過instanceof得出蘋果是水果的結(jié)論蜀细。
2 構(gòu)造函數(shù)模式
2.1 創(chuàng)建
function Fruit(name,colors) {
this.name = name;
this.colors = colors;
this.getInfo = function () {
console.log(this.name+"是"+this.colors+"的");
}
}
var apple = new Fruit("蘋果",["紅色","黃色"]);
2.2 說明
利用構(gòu)造函數(shù)模式可以解決對象識別問題,但其主要問題是每個方法在每個實例上重新創(chuàng)建一遍谆刨,沒有做到方法的重用归斤。
3 原型模式
3.1 創(chuàng)建
function Fruit() {
}
Fruit.prototype.name = "水果";
Fruit.prototype.colors = [];
Fruit.prototype.getInfo = function () {
console.log(this.name+"是"+this.colors+"的");
}
var apple = new Fruit();
apple.name = "蘋果";
3.2 說明
原型模式?jīng)]辦法向構(gòu)造函數(shù)傳遞參數(shù),原型中所有的屬性是被多實例共享的脏里,對于引用類型的共享屬性的操作可能引起突出的問題。例如向蘋果的顏色屬性put一個"紅色"(apple.colors.push("紅色")
)番舆,哪么所有水果通過原型訪問到的顏色都是"紅色"矾踱,而這是很危險的恨狈。
4 組合模式(構(gòu)造函數(shù)與原型)
4.1 創(chuàng)建
function Fruit(name,colors) {
this.name = name;
this.colors = colors;
}
Fruit.prototype = {
constructor : Fruit,
getInfo : function () {
console.log(this.name+"是"+this.colors+"的");
}
}
var apple = new Fruit("蘋果",["紅色","黃色"]);
4.2 說明
組合模式是最常見的創(chuàng)建自定義對象的方式禾怠,構(gòu)造函數(shù)模式用于定義實例屬性圣蝎,原型模式用于定義方法和共享屬性∨枪可以最大限度的節(jié)省內(nèi)存。
5 動態(tài)原型模式
5.1 創(chuàng)建
function Fruit(name,colors) {
this.name = name;
this.colors = colors;
if(typeof this.getInfo != "function") {
Fruit.prototype.getInfo = function () {
console.log(this.name+"是"+this.colors+"的");
};
}
}
var apple = new Fruit("蘋果",["紅色","黃色"]);
5.2 說明
很完美的方式坦袍,把所有信息都封裝在構(gòu)造函數(shù)中。只有在getInfo()方法不存在的情況下捂齐,才會將它添加到原型中缩抡。原型的這段代碼只會在初次調(diào)用構(gòu)造函數(shù)時才會執(zhí)行。
6 寄生構(gòu)造函數(shù)模式
6.1 創(chuàng)建
function Fruit(name,colors) {
var o = {};
o.name = name;
o.colors = colors;
o.getInfo = function () {
console.log(this.name+"是"+this.colors+"的");
}
return o;
}
var apple = new Fruit("蘋果",["紅色","黃色"]);
6.2 說明
這種方式和工廠模式代碼其實是一樣的压真,只是函數(shù)名采用了Fruit的首字母大寫的形式,并且用new來進行初始化滴肿。這種模式可以在特殊的情況下用來為對象創(chuàng)建構(gòu)造函數(shù)。
7 穩(wěn)妥構(gòu)造函數(shù)模式
7.1 創(chuàng)建
function Fruit(name,colors) {
var o = {};
o.getInfo = function () {
console.log(name+"是"+colors+"的");
}
return o;
}
var apple = Fruit("蘋果",["紅色","黃色"]);
7.2 說明
穩(wěn)妥對象(durable objects)是由道格拉斯(douglas)發(fā)明贵少。指的是沒有公共屬性堆缘,并且其方法也不引用this的對象滔灶。適合在安全環(huán)境中實用套啤。
8 摘要
JavaScript自定義對象創(chuàng)建的幾種方式,包括工廠模式、構(gòu)造函數(shù)模式绪氛、原型模式、組合模式(構(gòu)造函數(shù)與原型)争占、動態(tài)原型模式序目、寄生構(gòu)造函數(shù)模式、穩(wěn)妥構(gòu)造函數(shù)模式猿涨。給出了所有7種方式的創(chuàng)建示例代碼及其簡單說明。這幾種創(chuàng)建方式并沒有絕對的好與壞叛赚,不同的方式適合于不同的應(yīng)用場景,大家要靈活選擇肥卡。