2014-11-03 47 views
0

在使用閉包的對象上調用new時,從我所瞭解的閉包設置實例化中,其中私有變量將是'class'的靜態屬性。在JavaScript中使用閉包調用新對象

例:

var testClass=(function(){ 
    var self={...properties...}; 
    return function(){ 
    return { 
     someFunc: (function(){ 
      var self={...other properties...} 
      return { 
      self: self 
      }; 
     }()) 
    }; 
    }; 
}()); 

var newObject=new testClass(); 

所以,如果我需要someFunc實例作爲的TestClass的屬性我可以用上面的語法存儲?在每次創建新的testClass實例時,將會實例化someFunc中的'var self',或者將閉包作爲一次處理,其中所有實例都是instanceA.someFunc.self == instanceB.someFunc.self if instanceA = new testClass();和instanceB = new testClass();

希望這是有道理的。我還沒有測試過它還沒有看到

回答

1

這段代碼甚至不能正常工作。以下是將發生的事情:

外部IIFE將在代碼初始化時運行。這將建立:

var self = {...}; 

一次,然後變量testClass將包含您的內部對象。

然後,你會做什麼:

var newObject=new testClass(); 

,並得到一個錯誤,因爲TestClass的是一個對象,而不是一個構造函數。在這jsFiddle確切的錯誤是:Uncaught TypeError: object is not a function


編輯:現在您已經更改了代碼。

最上面的var self= {...}只會在外部IIFE運行時實例化一次。這對於testClass()的所有實例都是常見的。這是因爲外部IIFE只運行一次,並且在其中創建的變量成爲閉包的一部分,內部函數的所有實例(成爲您的實際構造函數)將共享。

self(一個在someFunc())將創建單獨每次obj.someFunc()被調用,內someFunc()的局部聲明一個將覆蓋更高層次self,你將無法從someFunc內進入更高一級。

我通常認爲在已經定義在更高層次的父範圍內的本地範圍中使用相同的變量名是一種糟糕的做法,因爲它沒有提供任何有用的功能,並且只是一個機會,導致對完全混淆或欺騙真的在繼續。選擇一個獨特的名字。

+1

是的,忘了添加返回功能。我改變了這個例子。道歉。 – 2014-11-03 02:56:55

+0

@MagicLasso - 這是一種痛苦。我診斷你的問題,並完全記錄在一個jsFiddle中,然後你改變代碼。無論如何,我試圖添加一個有關您更改的代碼的答案。 – jfriend00 2014-11-03 02:59:36

+0

哈哈哈對不起。我正在jsfiddle atm建設一個。所以內心的自我會被實例化爲新的或... – 2014-11-03 03:00:59