繼承
why?
多個類公用的功能,如果重複拷貝,一方面,工作量大,另一方面,如果公用功能需要修改,則需要修改所有類中的這個功能,重複工作量大。
為了減少複製以及帶來的不利於修改的問題,我們需要繼承
how?
三種方法:classical inheritance prototypal inheritance mixin classes
what?
第一種方法:classical inheritance
function animal(type)
animal.prototype.gettype = function()
利用原型鏈,實現繼承
function pat(type,name)
pat.prototype = new animal();
pat.prototype.constructor = pat;
pat.prototype.getname = function()
這種方法的實現步驟是:
2 建立原型鏈。在js中,所有物件都有乙個prototype的屬性,這個屬性指向別的物件或者null。當訪問物件的乙個屬性時,尋找的路徑方式是:先在物件內尋找,如果不存在,則到這個物件的prototype指向的物件中找,還是沒有找到,則到prototype指向物件的prototype指向物件中繼續尋找,知道找到屬性或者prototype為null。利用js的這個特性,要讓子類繼承父類,只需要讓子類的prototype 指向父類的乙個例項。
3 將子類的prototype物件的constructor屬性賦值為子類物件名。因為當你將子類的prototype屬性賦值為父類的乙個例項時,子類的prototype被清空了。
為了簡化繼承的過程,我們通過函式,封裝上面的流程
function extend(subclass,superclass); //1
f.prototype = superclass.prototype;
subclass.prototype = new f();
subclass.prototype.constructor = subclass;
//讓子類有乙個類屬性,指向父類
subclass.superclass = superclass.prototype;
if(superclass.prototype.constructor == object.prototype.constructor)
}
利用extend 繼承的方法如下:
function pat(type,name)
extend(pat,animal);
pat.prototype.getname = function()
在extend 方法中,有兩個地方需要再解釋下:
1 在繼承中,為了獲得父類的原型鏈,我們讓子類的prototype指向了父類的乙個例項物件,而父類例項化物件的屬性並不是我們需要的,如果父類建構函式比較負責,這樣就照成了不小的浪費。在extend 中,我們通過乙個空的類,讓空類的prototype指向了父類的原型鏈,進而讓子類的原型鏈執行空類的物件,達到了目的。
2 如果父類的prototype被重置,而沒有重新給constructor 賦值,constructor 屬性將指向object,故通過判斷,如果沒有賦值,則重新給他賦值。這樣,就能保證在注釋3的位置中,superclass.constructor ,指向了正確的類。
第一種方法:prototypal inheritance
fuction clone(object)
f.prototype = object;
return new f;
}
var animal =
}var pat = clone(animal);
pat.name ="xiaoge";
pat.getname = function()
var cat = clone(pat);
cat.name="mimi";
alert(cat.getname);//mimi
這種方法,通過常量物件來模擬繼承。這種方法的好處,是所有子類預設公用父類的屬性和方法,是一種節約記憶體的有效方法。而經典的繼承方式中,所有子類物件都儲存了乙份屬性。
第三種方法:mixin classes
通過將公用類的prototype中的方法,拷貝到類中,實現對類能力的增強
關鍵的函式
var mixin = function(){};
mixin.portotype =
}};function augment(receivingclass,givingclass)
}}
mixin 中通過prototype 包含公用的函式
augment 中,將mixin中的函式都拷貝到receivingclass中,除非receivingclass中已定義該方法。
幾種方法的比較:
classical inheritance 簡單易懂,最接近其他語言繼承的流程
prototypal inheritance 適用與記憶體比較緊張的情況
mixin classes 適合增強類,兩個類在語義世界裡,沒有繼承關係
js第四章作用域
一 動態的屬性 建立了乙個變數並且儲存在了變數person中 var person new object 為該物件新增了乙個名為name的屬性,將字串值 nicholas 賦值給name這個屬性 person.name nicholas alert person.name nicholas 只能給引...
HeadFirst設計模式總結 第四章工廠模式
讀後總結 主要參考p160 p161 1.依賴倒置原則 p142 抽象化的思想設計,面向介面程式設計,面向擴充套件而不是面向修改。變數不可以持有具體類的引用 基類使用new,即持有具體類的引用,使用工廠方法將new具體類部分下放到子類中,即行如。new nypizzastore 不要讓類派生自具體類...
第四章 繼承
一 為什麼要繼承 在物件導向中我們將具有很多重複內容的類中的內容提取出來,寫成乙個單獨的類 其他類只需要繼承就能取得這些功能,同時可以在自己類中寫入獨特的自定義方法 二 繼承語法 inte ce circle nsobject 繼承是在介面中定義的 冒號後的類名是要整合的類,nsobject 是co...