2017-01-30 1 views
0

私は現時点でpacmanのコードを作成しようとしていましたが、問題を見つけました: すべてのゴーストは同じ経路探索を使用しており、概してかなりsimularなので、私はそれらのプロトタイプを使いたいと思います。彼らが本当に異なっている唯一の財産は、方法です、彼らは目標位置を選択します。私はプロトタイプに関数を与えて、ゲッタとして使用したいと思います。それは可能ですか?あなたの助けのためのプロトタイプでゲッターとして関数パラメーターを使用する方法はありますか?

function Ghost(color,x,y,getterFunction){ 
    this.color = color; 
    this.x = x; 
    this.y = y; 
    this.direction = "up"; 
    this.move = function(){ 
     //Pathfind towards this.target 
    } 
    this.target = getterFunction; //or something like this... 
} 

ありがとう:^)

+0

いいえ、それが違うところなら、それはあなたがやっていることではありません*プロトタイプを載せたくありません。 – Bergi

+1

'this.target'の代わりに' this.target() 'を使うだけで、あなたのコードはうまくいくはずです。 – Bergi

+0

あなたはES6クラスの使用を検討しましたか?あなたはBabelを使ってコードをすべてのブラウザで動かせるようにすることができます – royalsampler

答えて

3

@Bergiは正しいです。あなたはゲッターとして使用したくありません。それをプロトタイプに追加しようとすると、プロトタイプは共有オブジェクトなので、作成するすべての新しいゴーストによって上書きされます。

プロトタイプは共有機能用です。インスタンス機能はインスタンスに属します(つまり、コンストラクタ関数内)。

あなたの移動機能はプロトタイプ上になければなりません。しかし、ターゲットはインスタンスメソッドでなければなりません。プロトタイプのターゲットのデフォルトメソッドを設定することができます。どのインスタンスメソッドも、プロトタイプを探す前に呼び出されます。だから今

function Ghost(color, x, y, target){ 
    // everything in here is instance specific 
    this.color = color; 
    this.x = x; 
    this.y = y; 
    this.direction = "up"; 

    if (typeof target === 'function') { 
     this.target = target; 
    } 
} 

// this is the prototype 
Ghost.prototype.move = function() { 
    //Pathfind towards this.target 
    this.target() 
} 

Ghost.prototype.target = function() { 
    // default target to use if no target provided at creation 
} 

例、あなたがこれを行う:

var redGhost = new Ghost('red', 0, 0, function() { 
    //do something unique 
}) 

あなたが赤だとカスタムターゲット機能を持っている幽霊があるでしょうが。しかし、これを行う場合:

var yellowGhost = new Ghost('yellow', 0, 0) 

プロトタイプに追加したデフォルトのターゲット関数を使用するゴーストがあります。

+1

これは良い答えですが、実際にはサンプルコードの恩恵を受ける可能性があります。 –

+1

いくつかのコード例で編集された回答。 – shadymoses

+0

この回答は*素晴らしい*です。 +++はもう一度upvoteします。 –

関連する問題