2016-11-15 13 views
0

私はコンストラクタを持っていて、そのプロトタイプの中に関数の配列を持っていますが、配列のスコープではなくコンストラクタによって作成されたオブジェクトのスコープを持つ関数が必要です。 .bind(this)または.bind(_p)を使ってみましたが、 "this"はノードサーバーのスコープで、_pは変数のないプロトタイプです。配列内の配列のスコープを無視する関数

function BoardModel() { 
    this.x = 3 
    this.y = 2 
} 

_p = BoardModel.prototype; 

_p.skillFunctions = [ 
    function(){ 
     console.log(this.x); //undefined 
    }, 
    function(){ 
     console.log(this.y); //undefined 
    }, 
]; 
+0

これらの関数をコンストラクタで作成したオブジェクトに使用する場合は、オブジェクト参照をコンストラクタに渡すのはなぜですか。 – Azamantes

+0

私はパラメータのオブジェクトを渡すだけの関数を呼び出すときはいつでもですか?それは可能だろうと思う、より自然な解決策を望んでいた。 – Fuseques

+1

©Maayan Blum他のメソッドと同じようにプロトタイプに関数を追加し、呼び出す関数名の配列を含むプロトタイプ(またはカスタマイズしたい場合は作成したオブジェクト)のプロパティを持つことができます。次に、配列全体を繰り返し、 'this [methodName](); 'のようなメソッドを呼び出すだけです。 – Azamantes

答えて

0

アレイではなく、プロパティごとに独自のメソッドを使用してみませんか?

function BoardModel() { 
 
    this.x = 3 
 
    this.y = 2 
 
} 
 

 
_p = BoardModel.prototype; 
 

 
_p.skillFunctionsX = function(){ 
 
    console.log(this.x); 
 
}; 
 

 
_p.skillFunctionsY = function(){ 
 
    console.log(this.y); 
 
}; 
 

 
var item = new BoardModel; 
 
item.skillFunctionsX(); 
 
item.skillFunctionsY();

+0

インデックスで呼び出すことができる必要があります。 – Fuseques

0

アロー機能が囲んでいるコンテキストから、これを使用しこれについて(しゃれが意図した)ので、どのように?

function BoardModel() { 
    this.x = 3 
    this.y = 2 

    this.skillFunctions = [ 
     () => { console.log(this.x) }, 
     () => { console.log(this.y) }, 
    ]; 
} 

let board = new BoardModel() 

board.skillFunctions.forEach((skillFunction) => { skillFunction() }) 
+0

このようにして、コンストラクタが呼び出されるたびに関数が作成されます。私は_p.skillFunctions []の中で矢印関数を使ってみましたが、スコープはまだ配列のスコープでした。 – Fuseques

+0

@MaayanBlumはい、配列の矢印関数は、この例ではグローバルオブジェクト(厳密モードでは未定義)となる囲みコンテキストに "this"を設定します。あなたが想像したように想像したようにすることはできません。しかし、個々の関数をプロトタイプに直接作成することもできます.Ninaの提案によれば、関数名の配列を保持し、それを反復して関数を呼び出すことができます。あるいは、コンテキストを渡すこともできます。 –