js 設計模式 第四章

2021-06-10 06:37:27 字數 2722 閱讀 4641

繼承

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...