3

這兩個語句在Javascript中有區別嗎?Javascript和原型繼承

function p() { 
    this.do = function(){alert('cool')}; 
} 

這一個?:

function p(){}; 

p.prototype.do = function(){alert('cool')}; 

還有一件事,你爲什麼不能做:

function p(){}; 

p.do = function(){alert('cool')}; 

太謝謝你了!

+0

作爲構造函數還是作爲常規函數調用'p'? (這種 - 有很大的區別':)') –

+0

構造函數...我想....我不完全確定,我是新來的,對不起:( –

+0

等待,是的構造函數。 m很確定 –

回答

0

從功能上講,它們是一樣的。

第一個爲每個對象定義了一個函數,因此從記憶的角度來看它並不是最優的。

可以做你在你的第三個例子展示了什麼,但你不會實現你的想法:

function p(){}; 

p.do = function(){alert('cool')}; 

p.do(); // this will work 

var o = new p(); // This won't have the 'do' function because that's not how it works in javascript. 
+0

好吧,謝謝! –

3

鑑於你的前兩個例子,假設你叫p()作爲構造函數:

  • 表面上,他們會表現相同

但是與第一實施例...

  • 將創建用於從new p()
  • [即函數]創建的每個對象一個新的,相同的功能可以訪問的局部變量和參數的p()構造內部
//         p.prototype = {} 
new p(); // { do:function(){alert('cool')}; } ------^ 
new p(); // { do:function(){alert('cool')}; } ------^ 
new p(); // { do:function(){alert('cool')}; } ------^ 

和第二示例...

  • 將分享從new p()
  • [即函數]創建的所有對象之間放置在原型的功能將無法獲得私有變量/參數在構造
//p.prototype = {do:function(){alert('cool')};} 
new p(); // {} ------^ 
new p(); // {} ------^ 
new p(); // {} ------^ 

第三個例子不起作用,因爲在JavaScript中,函數是一個對象,所以你只需要在該對象上放置一個新的屬性即可。它對該函數的調用沒有影響。

+0

令人驚歎的解釋,非常感謝! –

+0

@Nathan:不客氣。 :) – user113716

+0

但還有一個問題,哪一個更「好」,可以這麼說呢? –