

Javascriptでrpgゲームを作っているなかで、状態異常や強化などを追加しようとしています。そのため、一つ一つのキャラを表すキャラコンストラクタにそれらを表すコンディション配列を追加しました。  
しかしながら、そこの配列のなかからキャラの値を取得できず、困っています。

コード

[code]

    function Chara(hp,attack){
      this.myname = "chara"
      this.hp = hp;
      this.attack = attack;
      this.condition = [];
    }  
    
    function Condition(target){
      this.myname = "target"
      this.target = target;
    }
    
    Condition.prototype.effect = function (){
       this.Target += 50;
    }
    
    Condition.protopype = Object.create(Chara);
    
    const Chara1 = new Chara(50,50);
    const Condition1 = new Condition("attack");
    Chara1.condition.push(Condition1);
    Condition1.effect();
    //　target(キャラのステータス)に50追加したい
    
[/code]

このeffect関数のなかでthisがchara1を指すようにしたいのですが、どうすればよいのでしょうか？


CC BY-SA 4.0
2020-01-25T04:11:18.693
62534
2020-01-25T05:13:05.027
2020-01-25T04:22:26.870
3068
37585
question
javascript
コンストラクタのなかの配列からコンストラクタの値を取得する


> このeffect関数のなかでthisがchara1を指すようにしたい

これだけをそのまま実現するならば、次のように`effect`を呼び出せばできます。

[code]

    Condition1.effect.apply(Chara1);
    
[/code]

ただ、これでは質問者さんが本当にやりたいことは実現できないでしょう。  
コードから察するに、`Condition`の`target`プロパティは、`Chara`の持つプロパティのどれを対象に補正をかけるか、を指定したものだろうと思います。  
だとすると、`effect`関数の`this`は`Condition`のままにしておかないと、`target`プロパティが参照できなくなってしまい、目的が達せられません。

対処は色々考えられますが、`Chara`は`effect`の引数として与えるのが簡単です。

[code]

    Condition.prototype.effect = function (chara) {
       chara[this.target] += 50;
    }
    
    // Condition.protopype = Object.create(Chara);  これは要らないと思う
    
    const Chara1 = new Chara(50,50);
    const Condition1 = new Condition("attack");
    Chara1.condition.push(Condition1);
    Condition1.effect(Chara1);
    
[/code]

なぜ`chara[this.target]`という書き方でいけるのか、ということについては、「JavaScript
ブラケット表記法」などのキーワードで調べてみてください。  
また、本当は更に、`Chara`の`condition`配列がちゃんと活かせるように工夫すべきだと思いますが、この質問の範囲を超えそうですので、ここまでにしておきます。


CC BY-SA 4.0
2020-01-25T04:58:31.750
62535
2020-01-25T05:13:05.027
2020-01-25T05:13:05.027
8078
8078
62534
answer