當我們用一個構造函數創建對象時,其屬性就會被添加到this中去。並且被添加到this中的屬性實際上不會隨著實體發生改變,這時,我們這種做法顯得會很沒有效率。例如: 這意味著每次我們new her()創建一個實例對象的時候都會生成一個全新的name屬性,併在記憶體中擁有屬於該屬性自己的存儲空間。而事實上 ...
當我們用一個構造函數創建對象時,其屬性就會被添加到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中。
好睏,一天都很壓抑,不敲了,早睡,再回。( ̄┰ ̄*)