1

私は 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
}

これがハックなのか、それともある種の「これをしないでください」ルールに違反しているのかを知る必要があります. または、より良い方法で書くことができるかもしれません。それをプロトタイプに追加するのはちょっと奇妙に思えるので、それを独自の関数のように扱います。

4

2 に答える 2

3

あなたがやろうとしていることは可能な方法の1つですが、もっと簡単にすることは可能です. オブジェクトのプロパティ名は必要な文字列ではないため、アクション インデックスをプロトタイプで直接使用できます。機能さえ必要ありませんdoAction

LittleDude = function LittleDude(container) {
  this.container = container;
}

LittleDude.prototype[0] = LittleDude.prototype.goUp = function goUp() {
  console.log('goUp', this.container);
}

LittleDude.prototype[1] = LittleDude.prototype.goUpRight = function goUpRight() {
  console.log('goUpRight', this.container);
}

var littleDude = new LittleDude(123),
    action = 1;
littleDude[action](); // --> goUpRight 123
littleDude.goUp(); // --> goUp 123
于 2013-04-04T13:25:29.450 に答える