私は JavaScript の初心者なので、経験不足と、慣れ親しんだ言語との違いのために、これまで醜いコードを書いていることがあります。そのため、以下に投稿するコードは機能しますが、私はそれを正しい方法でやっているのだろうか、それともおそらくうまくいくのだろうかと思っていますが、それは恐ろしい習慣であるか、より良い方法があります.
基本的に、グリッド内を移動する小さな男がいます。彼はサーバーからアクションを受け取り、8 方向 (int) に移動できます: 0:上、1: 右上、2: 右... 7: 上-左。
サーバーは彼にこの値を送信し0 <= action <= 7
、彼は正しいアクションを取らなければなりません...今、switch-case構造を使用する代わりに. 関数 goUp() 、 goLeft() などを作成し、それらを配列にロードしたので、次のようなメソッドがあります。
var getActionFunction = actions[action];
actionFunction();
ただし、これをすべて設定するのは次のとおりです。
1) コンストラクター関数を作成します。
function LittleDude(container) {
this.element = container; //I will move a div around, i just save it in field here.
}
LittleDude.prototype.goUp() {
//do go up
this.element.animate(etc...);
}
LittleDude.prototype.actions = [LittleDude.prototype.goUp, LittleDude.prototype.goUpLeft, ...];
//In this array I can't use "this.goUp", because this points to the window object, as expected
LittleDude.prototype.doAction = function(action) {
var actionFunction = this.actions[action];
actionFunction(); //LOOK AT THIS LINE
}
注意を払うと、最後の行が機能しません..理由: インデックスを使用して配列にアクセスすると、たとえば LittleDude.prototype.goUp が返されます...したがって、「this」キーワードは未定義です..
goUp には "this.element" というステートメントがありますが、"this" は定義されていないため、次のように記述する必要があります。
actionFunction.call(this);
したがって、私の doAction は次のようになります。
LittleDude.prototype.doAction = function(action) {
var actionFunction = this.actions[action];
actionFunction.call(this); //NOW IT WORKS
}
これがハックなのか、それともある種の「これをしないでください」ルールに違反しているのかを知る必要があります. または、より良い方法で書くことができるかもしれません。それをプロトタイプに追加するのはちょっと奇妙に思えるので、それを独自の関数のように扱います。