2012-05-24 75 views
2

假設我在javascript中創建了一個對象。myObject.someFunc = function(){...};有什麼區別?或myObject.prototype.someFunc = function(){...}在JavaScript中?

var myObject = {}; 

之間有什麼區別...

myObject.someFunc = function(){...}; 

myObject.prototype.someFunc = function(){...} 
在javascript

我無法理解差異,或者是否存在差異以及如何以及何時使用這些語法。

看來,當我編寫這樣的代碼時,確實沒有什麼區別。

我正在尋找客戶端(瀏覽器)和服務器端(如node.js)的答案。

我想要正確,準確地編碼,這真的很困擾我。

+3

注意'prototype'屬性僅對函數對象有意義的,當它們被用作「建設者」 ...參見:http://stackoverflow.com/q/2111288 – CMS

+0

@CMS分毫不差 – Alnitak

+0

我想撤銷我的近距離投票 - 這已經結束不同之處在於它實際上不再是重複的。 – Alnitak

回答

3

在這種情況下:

var myObject = {}; 
myObject.someFunc = function(){...}; 

所有你正在做的是創建一個普通的對象,這恰好有一個屬性是一個函數的引用。這通常是爲了名稱間隔而完成的,即將共同對象下的一個地方的整個負載函數分組。

但是請注意,var myObject = {}實際上沒有prototype所以你的第二個例子是不可能的。

對於一個目的是有原型它必須是一個構造函數的結果,即

function MyObject() { 
    ... 
} 

MyObject.prototype.someFunc = function() { } 

var myObject = new MyObject(); 
// myObject.someFunc can now be used 

原型是構造函數的特性 - 沒有這個類的任何實例的。

如果將函數放在原型上,則只有函數對象的一個​​實例存在,並且將被該類的所有實例共享。這是更有效的內存,每個實例上都有一個副本。

無論代碼是在瀏覽器還是在服務器上,所有這些都適用 - 它仍然是相同的語言。

+0

Alnitak,提前道歉我是一個2周齡js noob。我對第一個例子中傳遞給方法的變量的範圍(我相信稱爲靜態),類方法和作爲原型例子的方法感到困惑?在前兩種情況下,變量有其自己的範圍,我們應該說是安全的。在原型示例中,如果所有實例共享相同的函數,那麼這是否意味着傳遞給方法/函數的變量具有共享範圍,因此可能會彼此重疊(假設它們不應該)。這裏有一個SO線程,但我找不到它。 –

+0

哦,是的,比你非常善良。 –

0

myObject.someFunc = function(){...}是該函數的一次性實例,誰的返回值正在分配給myObject的someFunc屬性。

myObject.prototype.someFunc = function(){}實際上是創建一個方法,可以在myObject上的任何位置調用,並且每次都會更改相同的值實例。

myObject.prototype.someFunc = function(num){ 
    this.num_to_be_stored = num; 
} 

將更改num_to_be_stored的值而不是someFunc,這是第一次發生的情況。

編輯:抱歉清晨不清楚我想說什麼。

+0

嗯,共享返回值,嗯,什麼?! – Alnitak

+0

對不起,但仍然完全不清楚你想說什麼。 – Alnitak

+0

你得到的是同樣的東西。乾杯。 – doogle

0

本質上講,這表示一個靜態方法(或在這種情況下連接至僅該對象(myObject的一種方法):

myObject.someFunc = function() {...}; 

這表示連接到對象(一個實例方法)的原型的方法:

myObject.prototype.someFunc = function() {...}; 
+0

如果你打算-1,至少發表評論。這個答案沒有錯。它比較了大多數程序員對JS的原型繼承模型更熟悉的常見OOP思想。 – doogle

+0

答案的前半部分是正確的,但下半部分是錯誤的和誤導性的。 'myObject.prototype'不是問題。您或者是構造函數的'.prototype'屬性,或者您是指支持它的JS環境中的'myObject .__ proto__'。 @ ryan的回答由於同樣的原因是錯誤的。 – jimbojw

相關問題