通过原型方法设置对象的属性

时间:2012-11-25 19:28:41

标签: javascript prototype underscore.js

我正在创建一个与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仍然很新,所以...我的逻辑出了什么问题?

1 个答案:

答案 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
}