2013-01-16 32 views
0

我有兩種不同的方式在匿名範圍內使用我的Javascript對象。在匿名範圍內使用Javascript Prototype對象

(function(){ 

    function MyObject() { 
     this.MyMethod = function() { 
      //code here 
     } 
    } 

    first = new MyObject(); 
    first.MyMethod(); 
})(); 

而且

(function(){ 

    function MyObject(){}; 

    MyObject.prototype.MyMethod = function() { 
     //code here 
    } 

    first = new MyObject(); 
    first.MyMethod(); 
})(); 

我知道原型版本更好,但我不知道,如果使用匿名範圍使得到的好處/缺點的差異。

+0

這沒有什麼區別。好處仍然是一樣的。雖然如果這意味着您只創建該構造函數的一個實例,那麼您只需使用對象文字。 –

回答

1

使用匿名的範圍都沒有區別。

的好處是一樣的使用在全球範圍內。

如果您實例MyObject的一個非常高數十倍「原型」版本將避免複製每個實例中的方法,因此將避免資源(內存)的浪費。

如果您實例MyObject的一個或兩個時候,它會在即時功能沒有區別爲在全球範圍內。

+0

我明白了,所以第一個例子更類似於PHP(因爲每次創建對象都會複製方法)。我猜測同樣的事情適用於原型有構造函數的情況嗎? –

+0

嗯......不,不是這樣。使用「原型」意味着對象的每個實例都將共享相同的方法,即通過引用進行訪問。所以這更像PHP。沒有「原型」,每個實例都會擁有自己的方法副本。 - 但是,比較Javascript和PHP(或C語言類似C語言或C++語言的優雅語言)可能會導致錯誤的結論或糟糕的編程模式,因爲JavaScript是一種無類和功能的語言。我建議學習一些JS基礎知識。 – Paolo

+0

......我寫這個是因爲我過去犯過同樣的錯誤!我認爲它看起來像C,讓我們把它看作是C有一些小的差異。不,不好主意。這是完全不同的事情! – Paolo

1

在這種情況下,我認爲他們幾乎等同。每次執行外部匿名函數時都會對它們進行解釋。

所以只要你調用只有一個new MyObject()裏面,也不要緊。如果你多次調用它,你最好使用原型版本。

1

我不認爲這有什麼區別。 IIFE(Immediatly Invoked Function Expression)是爲了防止變量泄漏到全局範圍。

MyObject都是構造函數,但第一個函數具有該實例的唯一屬性的功能(將在調用new時被克隆)。在第二個示例中,您將該方法添加到該構造函數的原型中,使其可用於所有實例,這就是爲什麼第二個示例是首選AFAIK的原因。