Javascript之prototype
文獻
[1] http://www.myowndb.com/blog/?p=26
當一個函數被設計來跟new一起使用的時候,稱為構造器constructor。
因為javascript一方面想跟傳統的對象建立方法接近,一方面又想有自己的特點,所以javascript使用構造器的方式比較奇怪。
當函數被建立的時候,會被賦給一個prototype成員,prototype是一個對象,該對象包含一個constructor成員,construtor成員指向該函數。並且這個prototype是用來擴充繼承於它的對象的重要方法。就目前能看到的情況而言,除了constructor,prototype好像沒有預定義什麼屬性,也許還存在其他的預定義屬性。
可以將其他成員member加到該函數的prototype中。當函數被new調用建立一個新的對象的時候,這些成員都會被串連link into到這個新對象。
這樣可以在沒有事先擴充新對象的情況下,通過prototype來添加新的constants和methods。
假設與問題:
prototype是一個對象,或者準確地說應該是一個對象指標?
為什麼prototype能實現繼承機制?
當在當前對象尋找某個屬性失敗的時候,ECMAScript會在當前對象的prototype指向的對象中繼續尋找該屬性,以此類推。所以在當前對象調用作為其原型prototype的對象裡的屬性的時候是可以成功的,所以說當前對象繼承了其原型對象的屬性,亦即實現了繼承機制。
關於建立新對象時發生的事情:
當建立一個新對象的時候,該對象的prototype將指向建立該對象的函數的prototype指向的對象。因此,考慮下面的代碼:
function fConstructor()
{}
fConstructor.prototype.mMethod = function mMethod{};
function fNewConstructor()
{}
var oNew = new fConstructor{};
//change the point of prototype
fConstructor.prototype = new fNewConstructor{};
這時,雖然mMethod指向被改變了,但是因為對象oNew的建立在這個改變之前,所以oNew.prototype已經指向了改變之前的,從fConstructor中擷取的prototype,並且將繼續指向。所以,mMethod的改變對已經建立的對象沒有影響,但是會影響下面建立的對象。也是基於oNew.prototype指向了fConstrutor中擷取的prototype,如果在建立了對象oNew之後,再改變比如fConstructor.prototype.mMethod指向的函數的話,oNew的mMethod也會改變成新的mMethod。