2015-12-07 44 views
1

我正在下面的代碼嘗試。prototype javascript confusion

function Foo(who){ 
     this.me = who; 
} 
Foo.prototype.identify = function(){ 
    return "I am " + this.me; 
}; 
var a1 = new Foo("a1"); 
a1.identify(); 
a1.identify = function(){ 
    alert("Hello, " + Foo.prototype.identify.call(this)); 
}; 
a1.identify(); 

上面的代碼運行良好,我明白爲什麼使用Foo.prototype.identify.call。我想測試我的這種認識,所以我改變a1.identify下面

a1.identify2 = function(){ 
    alert("Hello, " + a1.identify()); 
}; 
a1.identify2(); 

我上述預期的工作方式相同。我現在只是指通過直接協議鏈來識別。但是,當我在上面跑步時,我會變得不確定。我錯過了什麼(或誤解?)。

+0

我認爲你不打電話功能只是打印功能。它應該是這個alert(「你好,」+ a1.identify());'而不是'alert(「Hello,」+ a1.identify);' –

+2

現在還不清楚你的問題實際上是什麼。在上面的代碼中沒有「未定義」。你可以在這裏看到結果:http://jsfiddle.net/jfriend00/94yLngj6/。你可能打算寫'alert(「Hello,」+ a1.identify());'實際運行'a1.identify()'不只是打印出函數本身,但是當我運行上面的jsFiddle,沒有什麼顯示爲「未定義」。 – jfriend00

+0

感謝您的快速回復。是的,這是因爲我沒有a1.identify()在警報或沒有調用a1.identify2()()..謝謝你讓我意識到這一點!謝謝你倆的快速回答。嗯,還有,我在Chrome開發者工具中運行這個工具,並且當我以原始文章的形式運行代碼時,我還沒有定義它。 – user3502374

回答

1

我不太清楚你的問題是什麼。當我運行您的代碼in a jsFiddle時,其中沒有任何undefined。你在a1.identify上做alert()而不是a1.identify(),所以你實際上並沒有調用這個函數,我猜這是你的一個錯誤。相反,a1.identify只會試圖對將試圖轉儲該函數的源代碼(這是我的jsFiddle或您的代碼顯示)的方法執行.toString()轉換。

所以,很可能,你的意思是這樣:

a1.identify2 = function(){ 
    alert("Hello, " + a1.identify()); 
    //   parens added here ^^ 
}; 
a1.identify2(); 

也許你可能需要說明的是,這兩個可能是有點不同的東西:

Foo.prototype.identify 

a1.identify 

如果什麼都沒有直接分配到a1.identify,然後執行a1.identify()將無法​​直接在a1對象上找到.identify屬性,因此它會查找Foo.prototype,它會在那裏找到屬性名稱並在原型上執行該屬性。

但是,只要你做到這一點:

a1.identify = function() {...} 

然後,在你 「被覆蓋的」 這個屬性。現在,當你這樣做:

a1.identify() 

的JS解釋直接找到a1對象上的被覆蓋的屬性和執行的,而不是駐留在原型的屬性。當你做obj.property時,JS解釋器首先直接在對象上查找屬性,並且只有當它沒有被直接分配給對象時,纔會在對象的原型中搜索具有該名稱的屬性。

你似乎知道,你總是可以得到這對樣機的功能,即使財產已經重寫直接在物體上通過原型直接去:

Foo.prototype.identify.call(a1) 

所以,您可以覆蓋特定實例的原型屬性,即使您已覆蓋它,如果需要或想要,仍可以在原型上獲取原始屬性。

+0

感謝您的詳細解釋。公認! – user3502374

1
a1.identify2 = function(){ 
alert("Hello, " + a1.identify()); 
}; 
a1.identify2(); 

a1.identify()本來應該叫做()

a1.identify()調用alert()並且不返回任何值。在這種情況下,返回一個未定義的。所以,當a1.identify2()調用a1.identify()時,a1.identify()被執行並返回undefined。因此,你會看到「你好,未定義」。

如果要查看identify2()中的輸出,請在identify1()而不是警報中輸入return的值。

+0

謝謝你的幫助! – user3502374