Javascript JS模块模式:如何初始化本地对象

Javascript JS模块模式:如何初始化本地对象,javascript,Javascript,我对如何在JS模块实现中初始化本地对象感到困惑。我有一个局部变量(一个对象),我尝试在返回的对象文本中访问它;但是,当我尝试向该对象添加新属性时,它会说它未定义。但是如果我不这样做,那么我可以轻松地将本地对象的值设置为其他任何值 这是我的密码: var myModule = (function(){ var myLocalObj = {}; // I always get a warning in the IDE that this var is never read retu

我对如何在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

我将解释为什么这些行会像你看到的那样:

this.myLocalObj = coll; // this works just fine
this.myLocalObj.newProp = coll.prop // fails because 'myLocalObj' is undefined.
此.myLocalObj
未定义

因此
undefined='somevalue'
正在无声地失败。所以“这很好用”不是真的

this.myLocalObj.newProp
undefined.newProp
相同

undefined
没有属性,
newProp
,因此出现错误


当然,我还没有测试过这些,只是做了些准备,就像每个优秀的程序员应该做的那样!:D

我将解释为什么这些行会执行您看到的操作:

this.myLocalObj = coll; // this works just fine
this.myLocalObj.newProp = coll.prop // fails because 'myLocalObj' is undefined.
此.myLocalObj
未定义

因此
undefined='somevalue'
正在无声地失败。所以“这很好用”不是真的

this.myLocalObj.newProp
undefined.newProp
相同

undefined
没有属性,
newProp
,因此出现错误


当然,我还没有测试过这些,只是做了些准备,就像每个优秀的程序员应该做的那样!:D

问题在于
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];
}

希望你觉得它有用

问题在于
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引用返回的对象。因此,使用它会修改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'));
在代码中,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'));

您的IDE是正确的。请不要把变量和属性混淆起来。看起来我就是这么做的。因此,如果我想设置一个本地属性,然后稍后再获取它,那么最好的方法是什么?您可以使用
return{myPropObj:{},setObject:function(){…this.myPropObj…}。当然,属性从来不是真正的“本地”,任何可以访问对象的人都可以访问它们。您的IDE是正确的。请不要把变量和属性混淆起来。看起来我就是这么做的。因此,如果我想设置一个本地属性,然后稍后再获取它,那么最好的方法是什么?您可以使用
return{myPropObj:{},setObject:function(){…this.myPropObj…}。当然,属性从来都不是真正的“本地”,任何可以访问对象的人都可以访问它们。我认为“this”引用的是您上面提到的“api”对象,而不是调用的函数。您是对的,我错了,我会编辑我的答案,尽管如此,它确实可以让您直接访问myLocalObj,因为它在范围内。我认为“this”引用了您上面提到的“api”对象,而不是调用的函数。您是对的,我错了,我将编辑我的答案,尽管如此,它确实可以让您直接访问myLocalObj,因为它在范围内。我相信第一条语句工作得很好,因为它感觉就像是在创建一个新对象并分配一个初始值。但是第二条语句失败了,因为它不能在创建新对象的同时创建新属性。我相信第一条语句工作得很好,因为它感觉好像在创建新对象并指定初始值。但是第二条语句失败,因为它不能在创建新对象的同时创建新属性。