2017-11-16 5 views
0

クラスを作成する方法はありますか?そのクラスのコンストラクタメソッドでは、他のクラスの2つの異なるオブジェクトを他の情報と共に渡します。たとえば、3つのクラス、Statisticsクラス、Attributesクラス、Characterクラスがあるとします。彼らは一種のようになります。文字クラスのコンストラクタは13+の引数を持つことになりますのでES6 JavaScriptクラス

class Statistics { 
    constructor(stren, dex, wis, cha, armorClass, hitPoints) { 
     this._stren = stren; 
     this._dex = dex; 
     this._wis = wis; 
     this._cha = cha; 
     this._armorClass = armorClass; 
     this._hitPoints = hitPoints; 
    } 
} 

class Attributes { 
    constructor(name, race, sex, level, height, weight, speed) { 
     this._name = name; 
     this._race = race; 
     this._sex = sex; 
     this._level = level; 
     this._height = height; 
     this._weight = weight; 
     this._speed = speed; 
    } 
} 

、私は13+引数を持つコンストラクタを書くよりも優れていた他のクラスにそれらを分離することを考え出しました。

class Character { 
    constructor(Statistics statistic, Attributes attributes) { 
     ..... 
    } 
} 

EDIT::だからと似何かをする方法はありません、これはその質問の重複はありませんが、人々も、実際に読んでください質問が重複していると言って前に何を聞かれていますか?

+2

はいといいえ... 'コンストラクタ(統計は、属性)' - と2つの引数はコンストラクタ –

+0

に右のクラスであることを確認し、これらの新しいを渡すことに何か問題はありますオブジェクトを 'Character'クラスに引数として渡しますか? 「型検査」のない汎用的な引数として。 – Andrew

+0

'Character'が統計/属性からすべてのプロパティを取得しますか?もしそうなら、これを行う方法を示すフィドルです。https://jsfiddle.net/fhnqh2og/ – IrkenInvader

答えて

1

クラスは文法的な砂糖なので、Object.definePropertyCharacterプロトタイプを追加して独自のゲッターを作ることができます。

編集:DRYd up with a loop。

class Statistics { 
 
    constructor(stren, dex, wis, cha, armorClass, hitPoints) { 
 
     this._stren = stren; 
 
     this._dex = dex; 
 
     this._wis = wis; 
 
     this._cha = cha; 
 
     this._armorClass = armorClass; 
 
     this._hitPoints = hitPoints; 
 
    } 
 
} 
 

 
class Attributes { 
 
    constructor(name, race, sex, level, height, weight, speed) { 
 
     this._name = name; 
 
     this._race = race; 
 
     this._sex = sex; 
 
     this._level = level; 
 
     this._height = height; 
 
     this._weight = weight; 
 
     this._speed = speed; 
 
    } 
 
} 
 

 
class Character { 
 
    constructor(statistics, attributes) { 
 
     this.buildGetters(attributes) 
 
     this.buildGetters(statistics) 
 
     } 
 
     
 
     buildGetters(obj) { 
 
     for (let attr in obj){ 
 
      Object.defineProperty(Character.prototype, attr.replace("_", ""), { 
 
      get: function() { 
 
       return obj[attr] 
 
      } 
 
      }) 
 
     } 
 
     } 
 
} 
 

 

 
const stats = new Statistics() 
 
const attr = new Attributes("Mike") 
 
const mike = new Character(stats, attr) 
 
console.log(mike.name);

+1

なぜ 'Character'クラスの本文に' get name(){return this._attributes._name} 'と書かないのですか? 'Object.defineProperty'は、異なる名前のプロパティを動的に作成したい場合にのみ必要です。 – Bergi

+0

これについてのドキュメントを表示できますか?私は 'get'はES5のコンストラクタで動作することを知っていますが、クラス構文では動作しないという印象を受けました。 – Andrew

+0

ありがとうございました!それは私が後にしていることですが、私はそれを13回行うのはむしろ...時間がかかり、多くのスペースを取ることに同意します。より良い方法でこれを行う方法に関する提案はありますか? – Mike