2012-11-25 3 views
2

MongoLab HTTP API와 상호 작용할 수 있도록 작은 lib를 만들고 있지만 몇 가지 문제가 있습니다. 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] 
     }) 
    } 
} 

그리고 I가, 예를 들어, 사용자 모델 :이

var Model = require('models/Model') 

function User (properties) { 

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

    this.setFields(properties) 

    //[...] 
} 

setFields() 전화

나는 다른 모델의 프로토 타입으로 동작하도록 만들어진 모델 객체를 가지고 User 모델에 주어진 다섯 개의 필드 각각을 반복하여 올바르게 작동합니다. 사용자 속성은 설정하지 않습니다. setFields() 정의 끝 앞에 console.log(this.name)을 추가하면 undefined이 표시됩니다. 문제를 해결할 수있는 유일한 방법은 this 개체를 setFields 메서드의 인수로 전달하고 this 대신 인수를 사용하는 것입니다.

내게는 범위 문제가 생겼지 만 JavaScript OO에서는 여전히 새로운 편이어서 내 논리에는 어떤 문제가 있습니까?

+0

아, 그리고 난 [Underscore.js의 각 방법] (HTTP ://underscorejs.org/#each). – igorsantos07

+0

더 많은 코드가 필요합니다. 예를 들어, 표시된 코드에 따라'User'와'Model' 사이에는 아무런 연결도 없습니다. 또한'User'의 인스턴스는 어떻게 생성됩니까? 더 많은 코드 공유. –

답변

3

당신은 당신이 당신의 콜백 함수에 기대하고있는 this 컨텍스트를 설정하는 _.eachcontext 매개 변수를 제공해야합니다

setFields: function(values) { 
    _.each(this.fields, function(field) { 
     this[field] = values[field]; 
    }, this); // context parameter that establishes this in your callback 
} 
+2

어떻게 보지 못했습니까? :(... catch ... –

+0

duh. 주어진 context 인수를 사용하려고했으나 콜백 함수 내부에서 _.each()에 대한 세 번째 인수로 사용하지 않았습니다. haha ​​ ty! – igorsantos07