2012-04-14 6 views
1

簡単なテストで、Javascriptのプロトタイプ、特にNode.jsを念頭に置いています。 thisはリントのインスタンスを参照されていないため、未定義Node.jsプロトタイプの継承

function Lint() { 
    this.input = 'foo'; 
    events.EventEmitter.call(this); 
} 

Lint.prototype.dirs = function (dirs) { 
    _.each(dirs, this.files); 
} 

Lint.prototype.files = function (dir) { 
    console.log(this.input); // trying to get 'foo', returns undefined 
} 

var lint = new Lint(); 

lint.dirs(['js', 'js/views']); 

Lint.prototype.filesログ。私はここで何が欠けていますか?

私が考えることができる唯一の解決策は、最初のthisを回してLint.prototype.dirsから他の機能に移動することです。私はもっ​​と良い方法があると確信しています。

答えて

4

thislintオブジェクトを表しますが、Lintオブジェクトを_.eachに渡すことはありません。あなたはオブジェクトから関数を切り離し、それを渡しています。

あなたは... Function.prototype.bindを使用して所望の値に

_.each(dirs, this.files.bind(this)); 

を関数のコンテキストをバインドすることができますまたは、あなたはthis値への参照を保持し、かつ_.eachに匿名関数を渡すことができます...

var this_lint = this; 

_.each(dirs, function(v) { 
    this_lint.files(v); 
} 
+1

もちろん、なぜあなたはそれをCWでしたか? – alex

+0

@alex:それは今私のものです。私の答えはすべてCWですので、好きなだけ聞いてみてください。 ;-) –

+0

ありがとうございました!興味深いことに、このバリエーションはなぜfalseを返すのですか? 'var this_lint = this;' '_.each(dirs、this_lint.files);' –