標籤:改變 return 執行個體 原廠模式 自訂 不能 code 包含 地方
原廠模式:js中是沒有類的概念,就通過用函數來封裝以特定介面來建立對象,為對象添加屬性和方法,然後返回對象,這種模式可以解決建立多個相似對象寫大量重複代碼的問題,但是它卻不能解決對象識別的問題。
function createrPerson(name,age){ var o = new Object(); o.name = name; o.age = age; o.sayName = function(){ alert(this.name); }; return o; } var person1 = new createrPerson("aaa",18); var person2 = new createrPerson("bbb",8); person1.sayName(); person2.sayName();
構建函數模式:建構函式可以用來建立特定類型的的對象(原生和自訂),可以向建立內建對象執行個體一樣使用new操作符,此模式可以通過instanceof檢測物件類型,這是超過原廠模式的地方,但是它是缺點是建構函式裡的方法在每個執行個體上都會建立一次,因為它的每個成員都無法得到複用。注意這兩段代碼的區別
function createrPerson(name,age){ this.name = name; this.age = age; this.sayName = function(){ alert(this.name); }; } var person1 = new createrPerson("aaa",18); var person2 = new createrPerson("bbb",8); person1.sayName(); person2.sayName();
原型模式:使用建構函式的prototype屬性來指定那些應該共用的屬性和方法,這樣person1和person2執行個體都共用了同一個sayname方法,所以在最後一行是列印true,
這是與建構函式不同的地方。但是這種模式對於包含有參考型別的屬性就有問題了,因為是共用的,如果想改變一個實力的屬性,而其他的實力也會隨時被更改。
function Person(){}
Person.prototype.name = "aaa";
Person.prototype.age = 18;
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
person1.sayName();
var person2 = new Person();
person2.sayName();
alert(person1.sayName == person2.sayName);
組合模式:是結合建構函式和原型模式的,使用建構函式定於實力屬性,用原型定義共用屬性和方法。這樣就保證了每個執行個體都有自己的屬性
function Person(name,age){ this.name = name; this.age = age; this.friends = ["ccc","ddd"]; } Person.prototype = { constructor : Person sayName : function(){ alert(this.name); } } var person1 = new Person("aaa",12); var person2 = new Person("bbb",3); person1.friends.push("eee"); alert(person1.friends); alert(person2.friends); alert(person1.friends === person2.friends); alert(person1.sayName === person2.sayName);
js關於建立對象的幾種模式