改述这个问题:下面描述模块模式的两个描述有什么区别?描述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(){
答案 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
是仅可由模块闭包范围中的函数访问的局部变量,即getXproductype
和ready
。可以防止直接访问它,只能通过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,这似乎是完美的。