2

MongoLab HTTP API とやり取りするための小さなライブラリを作成していますが、いくつか問題があります。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]
        })
    }
}

たとえば、 User モデルがあります。

var Model = require('models/Model')

function User (properties) {

    this.fields = [
        'id',
        'name',
        'surname',
        'email',
        'password'
    ]

    this.setFields(properties)

    //[...]
}

そこでは、setFields()呼び出しが正しく機能し、User モデルで指定された 5 つのフィールドのそれぞれを反復処理します。ただし、ユーザー プロパティは設定されません。定義console.log(this.name)の末尾にa を追加すると、 が得られます。この問題を回避する唯一の方法は、オブジェクトをメソッドの引数として渡し、代わりに引数を使用することでした。setFields()undefinedthissetFieldsthis

私にはスコープの問題のように見えますが、私はまだ JavaScript OO に慣れていないので... 私のロジックの何が問題なのですか?

4

1 に答える 1

3

コールバック関数で期待するコンテキストを設定するためのcontextパラメーターを指定する必要があります。_.eachthis

setFields: function(values) {
    _.each(this.fields, function(field) {
        this[field] = values[field];
    }, this);  // context parameter that establishes this in your callback
}
于 2012-11-25T19:33:36.063 に答える