2013-06-20 67 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'。内部变量是匿名函数的局部变量,但是由于该闭包而引用了它。 –

相关问题