javascript高級程序設計一書----關於建立和對象繼承的總結

首先是生成對象的模式:
1工廠模式:
用函數封裝特定接口建立對象的細節:
function createPerson(name,age,job){
var o=new Object();
o.name=name;
.....
return o;
}
var person1= createPerson(.....);
var person2= createPerson(......);
 
缺點:未解決對象識別的問題(怎樣知道一個對象的類型)。
 
 
2構造函數模式:
建立自定義的構造函數。
function Person(name,age,job){
this.name=name;
this.sayname=new Function("alert(this.name)");
....
}
var person1=new Person(...........);
var person2=new Person(...........);
 
Person方法與工廠模式的createPerson方法不一樣之處:沒顯式地建立對象。直接將屬性和方法賦給this對象。沒有return語句.
 
對比工廠模式,構造函數模式建立自定義的構造函數意味着未來能夠將它的實力標識爲一種特定類型。
 
缺點:每一個在構造函數裏邊的方法在每一個實例上都要從新創造一遍。Function實例也是對象。person1的sayname和person2的sayname是不同的。
若是將this.sayname=sayname;
在構造函數外聲明:
function  sayname(){
alert(...);
}
雖然sayname此時指向同一個函數的指針。可是全局做用域的函數怎麼只能讓某一個對象調用呢?此外,若是有不少這樣的方法,在全局內就要定義不少。毫無封裝性可言。
 
 
3原型模式
function person(){}
person.prototype.name="........";
......
......
var person1=new person();
能夠用對象字面量來重寫整個原型對象:
person.prototype={
name:"........",
.........
}
 
也會存在問題,若是屬性裏邊的值是引用類型的話,那麼修改的後果的波及範圍是很大的。好比說屬性的值是數組。。。
 
解決方案:組合使用構造函數模式和原型模式。
構造函數模式用於定義實例屬性,而原型模式用於定義方法和共享屬性。這樣,每一個實例都會有本身的一份實例屬性的副本,同時共享對方法的引用。節省了內存。
function Person(name,age,job)
{
this.name=name;
.........................
}
Person.prototype={
constructor:Person,
sayName:function(){
.............};
}
 
在前幾種模式都不適用的狀況下可使用寄生構造函數模式(其實和工廠模式差異就在於有個new)。
例子:
function Person(name,age,job){
var o=new Object();
o.name=name;
.....
return o;
}
var person1=new  Person(.....);
var person2=new  Person(......);
 
以及穩妥構造函數模式,穩妥與寄生大致類似.但有兩點不一樣,一是新建立對象的實力方法不引用this,二是不實用new來調用構造函數。
 
 
 
繼承:
原型鏈
關鍵在於:
SubType.prototype=new SuperType();
謹記!在經過原型鏈實現繼承是,不能使用對象字面量建立原型方法!不然會重寫原型鏈。
原型鏈同樣也會出屬性值是引用類型的問題。第二個問題:建立子類型的實力時,不能向超類構造函數傳遞參數。
 
 
借用構造函數(有時候叫作僞造對象或者經典繼承)。
思想很是簡單:在子類型構造函數的內部調用超類型的構造函數。
 
function supertype(name)
{
this.color=["red","green"];
this.name=name;
}
function subtype()
{
 supertype.call(this,"nicholas");
}
 
var a=new subtype();
var b=new subtype();
這樣,引用類型值得數組就不是共享的了。而是兩份副本。並且也能夠傳遞參數了。
缺點:方法都在構造函數都定義好,函數的複用就無從談起了。單獨使用就少了。
 
 
 
組合繼承(僞經典繼承)
指將原型鏈和借用構造函數的技術組合到一塊。原型鏈實現對原型屬性和方法的繼承,二經過借用構造函數來實現對實力屬性的繼承。見書169頁!!!雖然組合繼承是javascript最多見的繼承模式,可是不管什麼狀況下都會調用超類型的構造函數兩次!!!一次是在call的時候一次是在原型繼承的時候。這時候實例屬性就會屏蔽原型中的同名屬性。
 
那麼寄生組合模式是最理想的繼承範式。
function inheritPrototype()
{
var prototype=object(superType.protype);    建立對象
prototype.constructor=subType;
subType.prototype=prototype
}
用這個方法來代替對原型賦值的語句。
相關文章
相關標籤/搜索