天天看點

《JavaScript應用程式設計》一一3.5 原型克隆

本節書摘來華章計算機出版社《javascript應用程式設計》一書中的第3章,第3.5節,作者:eric elliott 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

有時你并不希望在原型上做資料共享,相反,你想讓每個執行個體都擁有一份屬于自己的原型拷貝。多數主流javascript類庫中早已經存在了一個用來對原型進行克隆的方法,以extend()方法最為常見,它首先被傳入一個待擴充的對象,之後所傳入的所有對象都是對第一個對象的擴充。

不過extend()方法并沒有出現在javascript規範中(盡管es6規範中定義的object.assign()方法與extend()方法十分相似), 在jquery與underscore中可以找到它的身影,它的實作也極為簡單。下面的代碼摘自underscore。

如你所見,它将第一個入參作為目标對象,随後周遊剩餘的入參,将剩餘入參對象中的公共屬性逐一拷貝至目标對象。當多個對象上的同名屬性值存在沖突時,永遠是後一個優先覆寫前一個。

來看看如何使用extend()方法來進行原型克隆:

在上述示例的extend()方法調用中,我們傳入了一個空對象字面量作為目标對象,switchproto在這裡被當作源對象。

原型代理與原型克隆間主要的不同之處在于,原型克隆中的執行個體屬性都是經過拷貝的,而原型代理在不同執行個體間隻共享一份屬性拷貝,在你對執行個體屬性進行重寫前,外界通路到的永遠是原型中所設定的屬性值。如此看來,原型代理對記憶體的消耗更少。

在實際應用中,為了建立各個執行個體間的共有方法與私有屬性,常常将這兩種方法混合使用。

繼續閱讀