2013-08-07 74 views
0

此方法結構/調用之間有什麼區別?
我經常看到不同的方法結構,我不明白每個方法的好處。JavaScript方法之間的差異結構

var obj = { 
    some_method: function(){ 
     return 'This works'; 
    } 
} 

var Obj2 = function(){ 
    return { 
     some_method: function(){ 
      return 'This works too'; 
     } 
    } 
} 

console.log(obj.some_method()); 

var obj3 = new Obj2(); 
console.log(obj3.some_method()); 

它們都返回他們應該,這裏的JsFiddle,但在什麼情況下,我應該用他們每個人的?

回答

1

第一個類似於singleton,I.E.你不能擁有多個相同類型但具有不同狀態的對象。就像它只能在你的整個應用程序中有一個實際的動物而不是很多。

更實際的例子,請考慮這個頁面。有多個Post s,每個都有自己的狀態(他們有什麼Comment,他們有什麼文本,他們正在編輯等等)。如果你只是做了var post =那麼這意味着只能有一個職位。我懷疑你可能會有一些專門的jQuery來操作該單例中的多個帖子,但是你不會對該問題進行面向對象的建模。


第二個被不正確地使用構造函數,則創建的對象不會是Obj2Object實例。你可以使用一個構造函數,如:

function Obj2() { 
    //initialize fields here 
} 

Obj2.prototype.someMethod = function(arg) { 
    return this.state + arg; 
}; 

原因返回對象文學作品中一個構造函數是一個構造 被允許返回任何類型的對象。但是,僅使構造函數 僅返回Object s是沒有意義的。

通常需要Object唯一用於分組相關靜態功能組合在一起(行爲,但沒有延長的數據) 或作爲字典/地圖/締合陣列(數據但沒有行爲)。

+0

第二個是某種形式的模塊模式可能嗎?當然,在這種情況下,它不一定要用'new'來調用。 –

+0

@FelixKling在模塊模式中,您可以立即調用它,因爲要求客戶端無需調用某個函數是沒有意義的。你應該能夠'var module = require(「module」);'而不是'var module = require(「module」)();' – Esailija

+0

我明白了。我從來沒有真正使用它,所以它只是在我的眼睛看起來類似:) –

0

在第一個代碼中,您打電話給obj.some_method()some_method是一個函數,嵌套爲obj的屬性。這種模式是命名空間的一種方式。

在第二種情況下,您正在創建一個對象,使用Obj2作爲構造函數。但是,不是返回Obj2的實例,而是返回了與前一個示例的obj具有相同結構的對象。這會給instanceof測試帶來錯誤的結果,因爲new Obj2應該返回自己的一個實例,而您的代碼並沒有這樣做。

+0

寫這樣的功能通常是當你想建立一個_Object_。大寫字母和'new'確實表明用作構造函數,但是(這個例子)如果作爲普通函數調用,它的作用是相同的 –