2012-10-07 6 views
16

は、私はこのようにJSのオブジェクトの配列を初期化することができます知っている:JavaScriptオブジェクトの配列とそのプロパティを初期化する良い方法はありますか?

var things = [ 
    { 
    prop1: 'foo', 
    prop2: 'bar' 
    }, 
    { 
    prop1: 'foo', 
    prop2: 'bar' 
    } 
]; 

私は(。申し訳ありませんが、私はC#の/ NET言語を使用しています)私はこれらの「匿名」のタイプを呼ぶだろうと思います。

これらを同じプロトタイプにしたい場合はどうすればよいですか?だから私は、コンストラクタを定義している:

var Thing = function Thing() { 
}; 

Thing.prototype.prop1 = 'default value'; 
Thing.prototype.prop2 = 'default value'; 

は今、私は上記の私の元のコード内のアイテムの両方がThing秒になりたいです。これを行う良い方法はありますか?

var things = [ 
    new Thing() { 
    prop1: 'foo', 
    prop2: 'bar' 
    }, 
    new Thing() { 
    prop1: 'foo', 
    prop2: 'bar' 
    } 
]; 

基本的にC#オブジェクト初期化子の構文です:私は推測していた場合は

、私は多分のようなものを言うでしょう。私は何を避けるためにしようとしていることである:

var thing1 = new Thing(); 
thing1.prop1 = 'foo'; 
thing1.prop2 = 'bar'; 
var thing2 = new Thing(); 
thing2.prop1 = 'foo'; 
thing2.prop2 = 'bar'; 
var things = [thing1, thing2]; 

編集:

私は私のプロトタイプにも共有されているいくつかの機能が含まれていることにも注意してください。また、実際に私は、配列を持っている以上のようなその何かので、深い3を入れ子になった:なぜ私だけinitにインラインで、このようなすべてのものを期待して、ラインで各プロパティラインを設定していないようである

{ 
    [ 
    { 
     [ 
     {}, 
     {} 
     ] 
    }, 
    { 
     [ 
     {}, 
     {} 
     ] 
    } 
    ] 
} 

答えて

13
var Thing = function(params) { 
    this.prop1 = params.prop1; 
    this.prop2 = params.prop2; 
}; 

var things = [ 
    new Thing({ 
    prop1: 'foo', 
    prop2: 'bar' 
    }), 
    new Thing({ 
    prop1: 'foo', 
    prop2: 'bar' 
    }), 
]; 
+2

これは私の状況で一番効果があったため、答えとしてマークしています。また、以下のようなオプションのプロパティを実行することもできました。 'function Thing(params){this.name = params.hasOwnProperty(" name ")? params.name: "some default"; } ' – CodingWithSpike

0

次のように動作する可能性がありますが、これも避けたいものですか?

var thing1 = new Thing(); 
var thing2 = new Thing(); 

thing1.prototype = { 
    prop1: "foo", 
    prop2: "bar" 
}; 

thing2.prototype = { 
    prop1: "foo", 
    prop2: "bar" 
}; 

もう一つは、私はそれには、次のようなものができますので、コンストラクタを自分で作っていると考えることができます:

var things = [ 
    new Thing({ 
     prop1: "foo", 
     prop2: "bar" 
    }), 
    new Thing({ 
     prop1: "foo", 
     prop2: "bar" 
    }) 
]; 
+0

それはちょっと奇妙です。 – JoshRagem

+1

これは、各オブジェクトインスタンスが基づいているプロトタイプを変更しないでしょうか?プロトタイプにもいくつかの共有機能がありますので、それらも緩んでいませんか? – CodingWithSpike

+0

@ CodeWithSpikeはいそうです=/ – jeremy

11

あなたはあなたの「コンストラクタ」を利用していません。そのYOURコンストラクタで値を初期化することが好ましい。その後、

var Thing = function Thing(prop1, prop2) { 
    this.prop1 = prop1; 
    this.prop2 = prop2; 
}; 

と実行します。この例で

var thing1 = new Thing("foo", "bar"); 
var thing2 = new Thing("foo", "bar"); 
+0

私はこの道を始めましたが、私のプロパティのいくつかも配列なので少し奇妙なので、私は 'new one(" foo "、[new Two([new Three()新しいThree()、新しいThree()]]、 "bar") 'のように見えます。私はあなたがおそらく正しいと思います。私は読みやすさのためにプロパティ名を保持しようとしていたと思います。 – CodingWithSpike

+1

@ CodeWithSpike、新しいクラスを作成する際に問題がある場合は、そのクラスのメソッドのユースケースがあるはずです。それ以外の場合は、オブジェクトと配列のリテラルを使用する方がよいでしょう。さらに、大量の静的データがおそらくJSONデータソースとして残されています。 – zzzzBov

1

私は、オブジェクトに「コンフィグ」メソッドを追加します。

function Thing() { 
} 
Thing.prototype.prop1 = 'foo'; 
Thing.prototype.prop2 = 'bar'; 
Thing.prototype.config = function(data) { 
    for (var i in data) 
     if (data.hasOwnProperty(i)) 
      this[i] = data[i]; 
} 

var array = [ 
    new Thing().config({ 
     prop1: 'foobar', 
     prop2: 'barfoo' 
    }) 
]; 
+0

' .config() 'とコンストラクタ自体でそれをすることに違いがありますか? '関数(データ){(データ内のvar i)のために) ...}'は基本的に@alcidesqueiroz答えです。 – CodingWithSpike

+0

さて、主な相違点は、コンストラクタに実装するよりも、 'Thing'を作成するたびにオブジェクトの反復を実行することです。暗黙のうちに' .config() 'メソッドを使用して、必要であれ、それのための。 –

+0

また、 '.config()'メソッドを既存のクラスに追加することもできます(ネイティブタイプを拡張することはお勧めしません) –