|
(each object inherits properties from its prototype).
對象的 prototype 通過它的 constructor function 來定義。JavaScript 里所有的 function 都有一個 prototype 屬性。這個屬性開始是空的,接下來你給他添加的任何屬性都會被 constructor 創(chuàng)建的對象所擁有。
prototype 對象和 constructor 相關(guān)聯(lián)。這意味著 prototype 可以作為放置方法以及其他常量的理想場所。原型中的屬性不會被復(fù)制到新創(chuàng)建的對象中去,他們的屬性看上去就像對象的屬性一樣。這意味著,使用原型能夠大幅度的減少多個同類對象占用的內(nèi)存。
每一個 class 都只有一個 prototype object, 附帶一套屬性。但我們在運行時可能會創(chuàng)建多個類的實例。那么如果發(fā)生對原型的屬性的讀寫會發(fā)生什么情況?
當(dāng)你讀一個屬性的時候,JavaScript 首先嘗試去查找對象本身是否有這個屬性,如果沒有,接著去查找原型里面是否有。有的話就返回結(jié)果。
而當(dāng)你寫原型的屬性的時候,因為多個對象共享原型,顯然是不能直接在原型上進行寫操作的。這個時候?qū)嶋H上 JavaScript 會在對象上創(chuàng)建一個同名的屬性,然后把值寫到里面。當(dāng)你下次讀這個屬性的時候,JavaScript 一下子就在對象的屬性里查找到了,那么就不需要去原型里查找了。這個時候,我們說“對象的屬性掩蓋或隱藏了原型的屬性”。(shadows or hides) 。
從上面討論看出,其實我們在設(shè)計類的時候,只要掌握一個原則:在原型里僅定義一些方法(方法一般是不會變的),常數(shù),常量等。做到這一點就不容易混淆了。
例子:







this.y = y; // The Y-coordinate of the center of the circle

this.r = r; // The radius of the circle












3.14159;






2
*
this.pi *
this.r; }






function( ) { return
this.pi *
this.r *
this.r; }





new Circle(0.0, 0.0, 1.0);


內(nèi)置的類的 prototype.
不光是用戶自定義的類可以有 prototype. 系統(tǒng)內(nèi)置的類比如 String, Date 也都有的。而且你可以向他們添加新的方法,屬性等。
下面這段代碼就對所有的 String 對象添加了一個有用的函數(shù):


function(c) {

this.charAt(this.length-1))

然后我們就可以類似這樣的來調(diào)用了:

"hello world";


JavaScript技術(shù):Javascript 原型和繼承(Prototypes and Inheritance),轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。