2016-05-18 3 views
0

MongoDBデータベースの出力を使ってクラスのインスタンスを構築しようとしています。私の問題は、クラスに入れ子クラスがあり、インスタンス化したいということにあります。 Object.assign()を使用するとトップレベルのオブジェクトしか作成できないようですが、内部のプロパティは「オブジェクト」なので、メソッドにアクセスすることはできません。内部オブジェクトを使ってオブジェクトを構築する方法

...に比べ

let obj = {address: { street: '1234 Rainbow Road' }}; 

class Person { 
    constructor(obj) { 
    Object.assign(this, obj); 
    } 
} 

class Address { 
    constructor(addr) { 
    this.address = addr; 
    } 

    printAddress() { 
    console.log(this.address); 
    } 
} 

let p = new Person(obj); 
p.address.printAddress() // fails, no function printAddress 

class Person { 
    constructor(obj) { 
    this.address = new Address(obj.address); 
    } 
} 

class Address { 
    constructor(addr) { 
    this.address = addr; 
    } 

    printAddress() { 
    console.log(this.address); 
    } 
} 

let p = new Person(obj); 
p.address.printAddress() // works 

例えばこれは一例であり、私のクラスはかなり大きいだけでなく、すべての内部クラスをインスタンス化速記する方法はありますか?または、2番目のコードスニペットのように分解する必要がありますか?ありがとう!

+0

関連:[ジャバスクリプト内のインスタンス(「クラス」)に機能するために、プレーンオブジェクトをキャスト](http://stackoverflow.com/q/11810028/1048572) – Bergi

+0

私はあなた 'Address'クラスが'持っている必要がありますね「住所」フィールドではない? – Bergi

答えて

1

あなたは番目のバージョンは、単一のプロパティのための設計上の選択として十分ですnew Person

let p = new Person(new Address({street: '1234 Rainbow Road'})); 
0

の引数リストにnew Addressを呼び出すことができます。

本格的なDIコンテナのようには見えませんが、プロパティの数が十分あれば、ある種のクラスマップが定型コードを削除するのに役立ちます。

class Person { 
    constructor(obj, classMap) { 
    for (let prop of Object.keys(classMap)) { 
     this[prop] = new classMap[prop](obj[prop]); 
    } 
    } 
} 

let p = new Person(obj, { address: Address }); 
関連する問題