2011-08-02 4 views
4

node.jsで私はクラス/オブジェクトと 'this'キーワードで苦労します。例えば:私はこのような.sortフラグメント削除する場合node.jsに汎用メソッドを定義する方法は?

function Set(arr,leq) { 
    this.leq = leq ? leq : function(x,y) {return x<=y;}; 
    this.arr=arr.slice().sort(this.geq); 
} 
Set.prototype.geq=function(x,y) { return this.leq(y,x);} 

var myset = new Set([1,5,3,2,7,9]); 


TypeError: Object #<Object> has no method 'leq' 
at [object Context]:1:47 
at Array.sort (native) 
at new Set ([object Context]:3:22) 
at [object Context]:1:13 
at Interface.<anonymous> (repl.js:171:22) 
at Interface.emit (events.js:64:17) 
at Interface._onLine (readline.js:153:10) 
at Interface._line (readline.js:408:8) 
at Interface._ttyWrite (readline.js:585:14) 
at ReadStream.<anonymous> (readline.js:73:12) 

しかし、:

var myset = new Set([1,5,3,2,7,9]); 
myset.geq(3,4) 
false 

まだ:

myset.arr.sort(myset.geq) 

TypeError: Object #<Object> has no method 'leq' 
at ... 

function Set(arr,leq) { 
    this.leq = leq ? leq : function(x,y) {return x<=y;}; 
    this.arr=arr.slice(); 
} 

を私はして問題がありませんだから:私はどのように最初のメソッドにアクセスする必要があるときに同じオブジェクト内の別のメソッド(leqなど)にアクセスできるオブジェクト内にメソッド(geqなど)を挿入します。 sortは機能しますか?

+0

純粋なJavaScriptの質問ではありませんか?提案するretag --node.js – Paul

答えて

2
this.leq = leq ? leq : function(x,y) {return x<=y;}; 

のみinstance.methodNameとしての機能への参照を渡すと、指定されたインスタンス

にその方法を結合しないため、動作しないの現在 インスタンスに

Set
this.arr=arr.slice().sort(this.geq); 

leq機能が割り当てられます

これはFunction.bindを使用して解決できます。

+0

ポイント2は+1ですが、私はあなたのポイント1で混乱しています。プロトタイプのメソッドは、インスタンス自体にあるかのようにインスタンスに対して呼び出すことができます。メソッドがインスタンス上にあった場合、OPに同じ問題が発生します。それとも、あなたが何を意味するのか誤解したことがありますか? – user113716

+0

@patrickはい、そうです。 – Alnitak

+0

ありがとう、@Alnitak。私は 'bind'メソッドを知らなかった。興味のある人のための解決策があります。すなわち、最初のコードフラグメントの3行目を 'this.arr = arr.slice()。sort(this.geq.bind(this));' – jonhaug

関連する問題