2014-03-31 28 views
1

b/w以下两种模式有什么不同吗?自执行第一个程序的优点是什么?Javascript - Module Pattern differences

var testModule = (function() { 
    var counter = 0; 

    return { 
    incrementCounter: function() { 
     return counter++; 
    }, 

    resetCounter: function() { 
     console.log("counter value prior to reset: " + counter); 
     counter = 0; 
    } 
    }; 
})(); 

testModule.incrementCounter(); // 1 

下一页:

var testModule2 = function() { 
    var counter = 0; 

    return { 
    incrementCounter: function() { 
     return counter++; 
    }, 

    resetCounter: function() { 
     console.log("counter value prior to reset: " + counter); 
     counter = 0; 
    } 
    } 
} 

var result = testModule2(); 
result.incrementCounter(); //1 
+2

最明显的区别是第一个可以只创建一个对象,而第二个可以创建多个。你在寻找什么以外的东西? –

+0

啊,我明白了。我没有注意到这一点。所以第一个只允许一个对象,第二个可以包含多个? – KingKongFrog

+1

那么,当你保留一个函数的引用时,你可以根据需要多次调用它。如果你没有引用,而只是立即调用它,它只有一次有用。这与模块模式无关。这只是简单的逻辑。你不能调用你不能引用的函数。 –

回答

4

第一种是单 - 你可以克隆它,当然,但它会很尴尬,第一次,也不会作出这样的私人副本变量:所有克隆对象的所有方法仍然可以使用相同的var counter。这就是为什么它适合制作类似服务的东西。

第二个是实际构造函数的变体 - 它适用于基于单个模板创建多个事物。它的缺点(与经典的基于prototype的模板相比)是,每次调用testModule2时,其中定义的所有函数都会重新创建。它的优点 - 私有变量,为每个新对象创建一个独立的集合(注意克隆用第一种方法创建的对象的区别)。