2012-12-05 75 views
8
var p = function() { 
    this.show = function() { 
     alert('hello world!!!'); 
    } 
} 

p.prototype.show = function() { 
    alert('haha'); 
} 

var o = new p(); 
o.show(); 

它報警"hello world!!!",爲什麼?爲什麼不在原型中聲明函數?

我可以修改原型方法嗎,如果是的話怎麼樣?

+1

一個非常全面的解釋:http://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript –

+1

FYI:如果你需要:你可以調用原型方法:'p。 prototype.show.call(o)' – Prinzhorn

回答

7

這是因爲您在構造函數中定義的特定函數覆蓋了通過原型繼承的特定函數。

EcmaScript specification

由構造器創建的每個對象都有一個隱含的參考 (被稱爲對象的原型),其構造的 「原型」屬性的值。此外,原型可能對其原型有一個非空的隱式引用,依此類推;這被稱爲 原型鏈。當引用一個對象中的一個屬性時, 引用的是第一個對象 中包含該名稱屬性的原型鏈中該名稱的屬性。在其他 單詞中,首先檢查直接提及的對象是否具有這種 屬性;如果該對象包含指定的屬性,即引用所引用的 屬性;如果該對象不包含 包含指定的屬性,那麼接下來檢查該對象的原型 ;等等。

簡而言之:當尋找一個函數(或其名稱的任何屬性)時,你從對象開始,然後在原型鏈上去。

+1

好回答=) –

3

您可以在p函數中覆蓋您的prototype.show方法。

1

在JavaScript中解析屬性時,引擎首先查看對象的屬性。在你的例子中,對象將由this表示。如果它找到屬性,在這種情況下show(記住函數可以是屬性),它使用該屬性。如果沒有找到該屬性,則會重複原型鏈以解決該屬性。

相關問題