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