使用模块模式的2个描述中的哪一个?

时间:2014-01-13 19:24:40

标签: javascript

改述这个问题:下面描述模块模式的两个描述有什么区别?描述1也是模块模式吗?当我调用其中一个时会发生什么?

我从描述2开始,我遇到了问题(Accessing property of javascript object gives wrong value),然后将模式重写为描述1(至少,我假设描述1仍然反映了模块模式?)来试验替代方案该问题的解决方案。

我还注意到(使用jsfiddle中的描述),通过描述1,我可以直接访问属性'xproducttype',并使用前面的描述2我需要使用Accessing property of javascript object gives wrong value中建议的解决方案。

描述1模块模式:

function userapp (){}; //module pattern
 //userapp properties 
 userapp.xproducttype = 1000;

 userapp.getXproducttype = function(){
   return this.xproducttype;
 };

userapp.ready = function(callback){
//here - before callback()- xproducttype is set to 0 by some code; 
//no further code changes xproducttype again (!)

callback();
 };//ready()

描述2模块模式 - 在问题Accessing property of javascript object gives wrong value

中使用
userapp = function(){ //module pattern
 //userapp properties 
 var xproducttype = 1000;

 var getXproducttype = function(){
   return xproducttype;
 }

 var ready = function(callback){
   //here - before callback()- xproducttype is set to 0 by some code; 
   //no further code changes xproducttype again (!)

   callback();
 };//ready()

 return{ xproducttype:xproducttype,
  getXproducttype:getXproducttype}
}(); //userapp = function(){ 

1 个答案:

答案 0 :(得分:0)

  

描述1模块模式:[...]

这应该被重写为等效的

var userapp = {
  xproducttype: 1000,
  getXproducttype: function() {
    return this.xproducttype;
  },
  ready: function(callback) {
    // some code
    callback();
  }
};
  

描述1也是模块模式吗?

是的,简单object literals are one implementation of modules。但是没有理由使用空函数作为基础对象。

  

下面描述模块模式的以下2个描述之间的区别是什么?当我调用其中一个时会发生什么?

在模式1中,xproducttype是模块对象的公共属性,可以由任何想要伤害它的人重新分配。吸气剂在这里实际上是多余的。在模式2中,xproducttype是仅可由模块闭包范围中的函数访问的局部变量,即getXproductypeready。可以防止直接访问它,只能通过getter方法访问它。

  

我还注意到,在描述1中,我可以直接访问属性'xproducttype',并且使用前面的描述2我需要使用[我在上一个问题的答案中建议的getter]。

是的,正是这就是模块模式中封闭范围所给出的私密性的含义(以及revealing modules的子模式)。

  

使用此模式的原因是模拟全局静态变量......

可能有一种更简单的方法可以做到这一点。对象文字对此很好,如果你想防止它们的属性被改变你可以使它们不可写。

userapp = Object.freeze({
    xproducttype: 1000
    // …
});
Object.defineProperty(window /*the global object*/, "userapp" {
    writable: false, configurable: false
});
  回调之前的

()xproducttype由某些代码设置为0;没有其他代码再次更改xproducttype(!)

这听起来不像是静态的东西,而是异步初始化的东西。您可能希望查看promises,这似乎是完美的。