Javascript 要使用模块模式的两种描述中的哪一种?

Javascript 要使用模块模式的两种描述中的哪一种?,javascript,Javascript,重新表述这个问题:下面描述模块模式的两个描述之间有什么区别?说明1也是模块模式吗?当我调用其中一个时会发生什么 我从描述2开始,在描述2中我遇到了一个问题(),然后将模式重写为描述1(至少,我假设描述1仍然反映了一个模块模式?),以试验该问题的替代解决方案 我还注意到(使用JSFIDLE中的描述),通过描述1,我可以直接访问属性“xproducttype”,通过前面的描述2,我需要使用中建议的解决方案 说明1模块模式: function userapp (){}; //module patter

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

我从描述2开始,在描述2中我遇到了一个问题(),然后将模式重写为描述1(至少,我假设描述1仍然反映了一个模块模式?),以试验该问题的替代解决方案

我还注意到(使用JSFIDLE中的描述),通过描述1,我可以直接访问属性“xproducttype”,通过前面的描述2,我需要使用中建议的解决方案

说明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模块模式-在问题中使用

说明1模块模式:[……]

这真的应该重写为等效的

var userapp = {
  xproducttype: 1000,
  getXproducttype: function() {
    return this.xproducttype;
  },
  ready: function(callback) {
    // some code
    callback();
  }
};
说明1也是模块模式吗

是的,很简单。但是,没有理由使用空函数作为基本对象

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

在模式1中,
xproducttype
是模块对象的公共属性,任何想要破坏它的人都可以重新分配它。在这里,getter实际上是多余的。在模式2中,
xproducttype
是一个局部变量,仅可由模块闭包范围内的函数访问,即
getxproducttype
ready
。禁止直接访问它,只能通过getter方法访问它

我还注意到,在描述1中,我可以直接访问属性“xproducttype”,而在前面的描述2中,我需要使用[getter,如我前面问题的答案中所建议的那样]

是的,这正是模块模式(及其子模式)中闭包范围给出的私有性的含义

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

也许有一种更简单的方法可以做到这一点。对象文字在这方面没有问题,如果要防止其属性发生更改,可以将其设置为不可写

userapp = Object.freeze({
    xproducttype: 1000
    // …
});
Object.defineProperty(window /*the global object*/, "userapp" {
    writable: false, configurable: false
});
在callback()之前,某些代码将xproducttype设置为0;不再对xproducttype进行进一步的代码更改(!)


这听起来不像是真正静态的东西,而是异步初始化的东西。您可能想看看哪一个似乎最适合此功能。

userapp.getXproducttype()
在您的第一个模式中不起作用。请在询问之前解决这个问题。另外,没有理由认为
userapp
是一个不可操作的函数-将它变成一个简单的对象
{}
@Bergi。Thnx。我修正了方法。我不确定我是否理解你的意思:“而且,没有理由说userapp是一个无操作函数——让它成为一个简单的对象{}”。你指的是这两个描述中的哪一个?指的是第一个-它是一个no op:-)使用此模式的原因(我确实没有提到)是为了模拟全局静态变量。。。
userapp = Object.freeze({
    xproducttype: 1000
    // …
});
Object.defineProperty(window /*the global object*/, "userapp" {
    writable: false, configurable: false
});