我正在创建一个与MongoLab HTTP API交互的小型lib,但我遇到了一些问题。我正在使用CommonJS模块。
我有一个Model对象,其作为其他模型的原型:
module.exports = {
//[...]
//this will be overriden by the other models
fields: ['id'],
setFields: function(values) {
_.each(this.fields, function(field) {
this[field] = values[field]
})
}
}
例如,我有一个用户模型:
var Model = require('models/Model')
function User (properties) {
this.fields = [
'id',
'name',
'surname',
'email',
'password'
]
this.setFields(properties)
//[...]
}
在那里,setFields()
调用正常工作,迭代用户模型中给出的五个字段中的每一个;但是,它不会设置用户属性。如果我在console.log(this.name)
定义结束前添加setFields()
,则会向我undefined
。解决问题的唯一方法是将this
对象作为setFields
方法的参数传递,并使用参数而不是this
。
对我来说这看起来像是一个范围问题,但我对JavaScript OO仍然很新,所以...我的逻辑出了什么问题?
答案 0 :(得分:3)
您需要向context
提供_.each
参数,以设置您在回调函数中期望的this
上下文:
setFields: function(values) {
_.each(this.fields, function(field) {
this[field] = values[field];
}, this); // context parameter that establishes this in your callback
}