2013-06-20 66 views
0

我有下面的代碼有和沒有模塊模式。我已經在執行旁邊給出了結果。在模塊模式中,我可以更改foo和set_inner,而在函數對象(非模塊)中,我不能更改foo和set_inner。爲什麼這個javascript對象的行爲與模塊模式不一樣?

module pattern: 
var someObj = (function() { 
    var instance = {},   
    inner = 'some value';  
    instance.foo = 'blah';  
    instance.get_inner = function() {   
     return inner;  };  
    instance.set_inner = function (s) {   
     inner = s;  };  
    return instance; })(); 

someObj.get_inner();//some value 
someObj.set_inner("kkkk"); 
someObj.get_inner();//kkk 
someObj.foo;//blah 
someObj.foo="ddd"; 
someObj.foo;//ddd 

non-module: 
var someObj = function() {  
    var instance = {},   
    inner = 'some value';  
    instance.foo = 'blah';  
    instance.get_inner = function() {   
     return inner;  };  
    instance.set_inner = function (s) {   
     inner = s;  };  
    return instance; }; 

someObj().get_inner();//some value 
someObj().foo;//blah 
someObj.foo="aaa"; 
someObj().foo;//blah 
someObj().set_inner("kkk"); 
someObj().get_inner();//some value 

任何幫助,非常感謝。謝謝!

回答

2

您的「模塊」示例創建了一個單一的對象,參見instance。匿名函數立即被調用,並返回該對象。所以someObj是指instance

您的「非模塊」示例會在您每次調用它時創建一個新對象。匿名函數不會立即調用。相反,每次你想使用它時都要調用它。

這將具有相同的行爲方式,如果你指定的返回值的變量,並提到了,而不是反覆調用someObj

var obj = someObj(); 
obj.get_inner(); //some value 
obj.foo; //blah 
obj.foo="aaa"; 
obj.foo; //aaa 
//etc... 
+0

謝謝,我需要有關鍵字「變種」之前,我聲明inner ='some value',inner不是實例的屬性,但get_inner和set_inner是訪問inner的實例上的方法。他們訪問這裏的原因是因爲關閉,我說得對嗎?或者是內部的,實例 –

+1

的屬性是的,'get_inner'和'set_inner'通過閉包訪問'inner'。內部變量是匿名函數的局部變量,但是由於該閉包而引用了它。 –

相關問題