JS模块模式:如何初始化本地对象
JS Module Pattern: How to initialize a local object
我对如何在JS模块实现中初始化本地对象感到困惑。我有一个局部变量(一个对象),我尝试在我返回的对象文字中访问它;但是,当我尝试向该对象添加新属性时,它说它是未定义的。但是如果我不这样做,那么我可以轻松地将本地对象的值设置为其他任何值。
这是我的代码:
var myModule = (function(){
var myLocalObj = {}; // I always get a warning in the IDE that this var is never read
return{
setObject:function(coll){
this.myLocalObj = coll; // this works just fine
this.myLocalObj.newProp = coll.prop // fails because 'myLocalObj' is undefined.
},
getObject:function(coll){
return this.myLocalObj;
}
};
})();
myModule.setObject(obj); // this is what I call after an ajax call is complete
问题是myLocalObj
不是返回对象的属性,而是属于该范围的本地变量。因此,您可以使用
setObject:function(coll){
myLocalObj = coll; // be aware! you're overriding the original {}
myLocalObj.newProp = coll.prop // now it works as expected
}
因为闭包(setObject)可以访问范围变量。您还需要一个 getter 才能从外部访问数据
getObject:function(){
return myLocalObj;
}
或者,如果您需要确保参考资料的安全
getProp:function(prop){
return myLocalObj[prop];
}
希望你觉得有用!
我将解释为什么这些行会做你所看到的:
this.myLocalObj = coll; // this works just fine
this.myLocalObj.newProp = coll.prop // fails because 'myLocalObj' is undefined.
this.myLocalObj
未定义。
所以undefined = 'some value'
正在默默地失败。所以"这很好用"是不正确的。
this.myLocalObj.newProp
与undefined.newProp
相同。
undefined
没有属性,newProp
,因此错误。
当然,我还没有测试过这些,只是像每个优秀的程序员一样,对它进行翅膀测试! :D
在代码中,this 引用返回的对象。因此,使用它会修改 api,而不是 myLocalObj。如果您希望能够为 myLocalObj 分配除已经存在的空对象以外的其他内容,则可能需要尝试这样的事情。
var improvedModule = (function(){
var myLocalObj = {};
var api = {
init: function(obj) {
if (obj) {
myLocalObj = obj;//if this is not an object the api may break doing this!!!
}
},
get: function(prop) {
if (myLocalObj[prop]) {
return myLocalObj[prop];
}
},
set: function(prop, val) {
myLocalObj[prop] = val;
}
};
return api;
})();
improvedModule.init({
foo: true,
bar: false
});
console.log(improvedModule.get('foo'));
相关文章:
- 通过iron-ajax初始化对象数组(链接到caller's元素的响应)
- 有了字段的名称,我如何用空白数据初始化对象的未定义字段
- 在fabric.js中初始化对象创建的子类
- 如何在 javascript 中初始化对象
- 用于初始化对象的编码模式 - 构造函数(新)与 Object.create()(Crockford)
- Javascript:按属性初始化对象
- Vue.js从 html 初始化对象属性
- 用数组初始化对象,Javascript
- 使用同一对象的其他属性初始化对象属性
- JQuery 不初始化对象
- 使用动态名称初始化对象 - coffeescript/node.js/javaScript
- 尝试在 JavaScript 中首先初始化对象
- 在javascript中初始化对象;t在编译时工作
- JavaScript 如何初始化对象使用数组
- 正在使用异步请求初始化对象
- 在JavaScript中初始化对象的空属性的正确方法是什么
- 在Javascript中创建和初始化对象成员的顺序
- 用javascript初始化对象
- 如何在javascript中初始化对象时使用元素名
- 如何正确初始化对象并从头开始