Javascript之prototype

來源:互聯網
上載者:User

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。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.