2012-11-25 48 views
2

我正在創建一個小的庫來與MongoLab HTTP API進行交互,但我遇到了一些問題。我正在使用CommonJS模塊。通過原型方法設置對象的屬性

我有一個模型對象,由表現爲原型的其他車型:

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()通話正確地工作,遍歷用戶模型中給出的五個字段中的每一個;儘管它不會設置用戶屬性。如果我在setFields()定義結束前添加console.log(this.name),它會給我undefined。我需要解決該問題的唯一方法是將this對象作爲參數傳遞給setFields方法,並使用參數而不是this

它對我來說看起來像是一個範圍問題,但對於JavaScript OO我還是很新的,所以......我的邏輯有什麼問題?

+0

哦,我[Underscore.js的每個方法(HTTP:/ /underscorejs.org/#each)。 – igorsantos07

+0

您將需要顯示更多代碼。例如,根據顯示的代碼,'User'和'Model'之間沒有連接。另外,如何創建'User'的實例?分享更多的代碼。 –

回答

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 
} 
+2

我怎麼沒有看到? :(......很好的捕獲。 –

+0

duh。我試圖使用給定的上下文參數,但....在回調函數內部,而不是第三個參數_.each()haha ty! – igorsantos07