为什么这个javascript对象在有和没有模块模式的情况下表现不同?

时间:2013-06-20 07:50:18

标签: javascript function object module

我有以下代码,有或没有模块模式。我已经在执行旁边给出了结果。在模块模式中,我能够更改foo和set_inner,而在函数对象(非模块)中,我无法更改foo和set_inner。

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 

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

您的“模块”示例创建了一个由instance引用的单个对象。立即调用匿名函数,并返回该对象。因此someObj是指instance

每次调用时,“非模块”示例都会创建一个新对象。不会立即调用匿名函数。相反,每次你想要使用它时都必须调用它。

如果您将返回值分配给变量并引用该变量,而不是重复调用someObj,它的行为方式会相同:

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