为什么这个JavaScript不能动态创建对象属性?

时间:2013-02-08 16:03:24

标签: javascript

此代码无法动态设置对象属性。 console.log(key, val)显示循环在options上正确迭代(与defaults合并,并按defaults的键过滤):

function Foo(options) {
   var defaults = { foo: "bar" },
       options  = _.defaults(options || {}, defaults);

    _.each(_.pick(options, _.keys(defaults)), function(val, key) {
        this[key] = val; // Not working
    });

    this.baz = 'bar'; // Works
};

var foo = new Foo();

foo.hasOwnProperty('foo'); // false
foo.hasOwnProperty('baz'); // true

Q1 :为什么它不起作用? this[key]错了吗?

Q2 :如何(通常)应该处理关键敏感问题,即通过{"FOO": "bar"}

功能(如果有关系):._defaults_.pick_.keys

2 个答案:

答案 0 :(得分:4)

this回调中的each上下文未指向包含函数Foo。您可以将上下文作为each的第二个参数提供:

_.each(_.pick(options, _.keys(defaults)), function(val, key) {
    this[key] = val;
}, this);

请注意,您根本不需要迭代值,只需使用_.extend

_.extend(this, _.pick(options, _.keys(defaults)));

答案 1 :(得分:0)

每个函数都有自己的“this”,所以_.each中的“this”与Foo中的“this”不同。你需要手动将Foo中的“this”传递给每个,为了做到这一点,你可以使用下划线函数_.bind。