主題:談談javascript原型構造機制

來源:互聯網
上載者:User

ecma太拙嘴饒舌,本文力圖用簡單的測試樣本來說明問題 

任意建立一個函數,其原型prototype立刻被自動建立: 

Js代碼 
  1. function Coo(){};  
  2. alert(Coo.prototype.constructor); //=>function Coo(){}  

執行個體化Coo的原型prototype被置於範圍scope的最頂端: Js代碼 

  1. function Coo(){  
  2.     alert(Coo.prototype.constructor);  
  3. }  
  4. var c1 = new Coo();  // => function Coo(){ ..}  

在執行個體化Coo之前修改其原型prototype,其範圍scope頂端自動調整為修改後的原型prototype,並且執行個體c1可沿原型鏈找到method方法 Js代碼 

  1. function Coo(){  
  2.     alert(Coo.prototype.method); // => function(){} 範圍scope頂端自動調整為修改後的原型prototyp  
  3. }  
  4. Coo.prototype = { method : function(){} }  
  5. var c1 = new Coo();  // => function(){}  
  6. alert(c1.method);  // => function(){}  

在執行個體化過程內部重新設定Coo的屬性prototype: Js代碼 

  1. function Coo(){  
  2.     alert(Coo.prototype.method); // => undefined 範圍scope頂端依舊為預設自動建立的原型prototype  
  3.     Coo.prototype = { method : function(){} }   
  4. //注意:上面這行重新設定了Coo的[b]屬性[/b]prototype,  
  5. //它已不再是Coo自動建立或是自動調整後的原型prototype了——這正是javascript原型機制的核心  
  6. }  
  7. var c1 = new Coo();  // => function(){}  
  8. //所以,雖然貌似:  
  9. alert(c1.prototype.method) // => function(){}  
  10. //但此[b]屬性[/b]——"prototype"(),已非彼[b]原型[/b]——"prototype"了:  
  11. alert(c1.method); // => undefined  

所以在執行個體化過程內部,只能基於原型prototype來擴充或修改方法 Js代碼 

  1. function Coo(){  
  2.     alert(Coo.prototype.method); // => undefined  
  3.     Coo.prototype.method = function(){}; // 在正宗原型prototype上擴充,非山寨!   
  4. }  
  5. var c1 = new Coo();  // => function(){}  
  6. alert(c1.prototype.method); // => function(){}  
  7. alert(c1.method); // => function(){};  

盤根究底,既然在執行個體化過程內部重新設定Coo的屬性prototype, 
那麼Coo的原型prototype又會去了哪兒呢? Js代碼 

  1. function Coo(){   
  2.     Coo.prototype = { method : function(){ alert("執行個體化中");} };  
  3. };  
  4. Coo.prototype = { constructor : Coo, method : function(){} }  
  5. var c1 = new Coo();  
  6. alert(c1.prototype.method); // => function(){ alert("執行個體化中");} 糟糕!  
  7. alert(c1.method); // => function(){} 謝天謝地!  
  8. alert(c1.constructor === Coo ); // => true; 原型鏈都還在,但它們似乎只是在內部被儲存起來了  

囉嗦了一大堆,簡而言之: 
函數的原型prototype是在執行個體化(或執行函數自身)之前就被自動建立(可以被修改或重設引用)的。 
而在執行個體化(或執行函數自身)過程中,重設的prototype已淪為一個普普通通的對象屬性了, 
但是他卻並不會干擾正常的javascript執行個體方法的原型鏈尋找機制。 

http://www.javaeye.com/topic/453432

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.