此代码无法动态设置对象属性。 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
。
答案 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。