當我們用一個構造函數創建對象時,其屬性就會被添加到this中去。並且被添加到this中的屬性實際上不會隨著實體發生改變,這時,我們這種做法顯得會很沒有效率。例如:
function her(){ this.name = 'Anna'; }
這意味著每次我們new her()創建一個實例對象的時候都會生成一個全新的name屬性,並在內存中擁有屬於該屬性自己的存儲空間。而事實上,我們可以將name屬性添加到原型上去,這樣一來所有實例都可以共享這個name屬性了:
function her(){} her.prototype.name = 'Anna';
這樣一來,我們再用new her()創建對象的時候,name屬性就不再是新對象的私有屬性了,而是被添加到該對象的原型中去了。雖然這種做法會很有效率,但這也是針對實例對象中的不可變屬性而言的,這是一定的不然的話改一下這個屬性,所有被創建的新對象的這個屬性都會被改變,這可不是我們想要的啊~~~。對象的公有屬性尤其適合這種方法。
下面,我們來改進以前的一個例子:
function her(){}; her.prototype.name = 'Anna'; her.prototype.toString = function(){ return this.name; } function his(){}; his.prototype = new her(); his.prototype.constructor = his; his.prototype.sex = 'women';
如您所見,通常我們在進行原型對象擴展之前,我們現完成了相關繼承工作的構建,否則his.prototype中後續新的屬性方法有可能會抹掉繼承來的東西。
function child(f, m){ this.eat = f; this.don = m; } child.prototype = new his(); child.prototype.constructor = child; child.prototype.name = 'Jok'; child.prototype.fun = function(){ return this.eat + this.don }
如您所見,實際上調用toString()這個方法的區別僅僅在於幕後的少量操作。主要區別也就是屬性,方法的查找工作將更多地發生在her.prototype中。
以上這篇javascript 將共享屬性遷移到原型中去的實現方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持。