17

私は次のようなJSオブジェクトの配列を初期化できることを知っています:

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';

ここで、上記の元のコードの両方の項目をThingsにします。これを行う良い方法はありますか?

私が推測すると、私は多分次のようなことを言うでしょう:

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つの深さでネストされた配列があるため、次のようになります。

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

そのため、各プロパティを1行ずつ設定するのではなく、このようにすべてをインラインで初期化することを望んでいます。

4

4 に答える 4

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'
  }),
];
于 2012-10-07T23:52:11.173 に答える
11

「コンストラクター」を使用していません。コンストラクターで値を初期化することをお勧めします。

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

そして、次のことを行います。

var thing1 = new Thing("foo", "bar");
var thing2 = new Thing("foo", "bar");
于 2012-10-07T23:49:33.923 に答える
1

この場合、オブジェクトに「config」メソッドを追加します。

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'
    })
];
于 2012-10-08T00:15:35.770 に答える
0

以下はうまくいくかもしれませんが、これも避けたいですか?

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

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

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

私が考えることができるもう1つのことは、コンストラクターを自分で作成して、次のようなものを許可することです。

var things = [
    new Thing({
        prop1: "foo",
        prop2: "bar"
    }),
    new Thing({
        prop1: "foo",
        prop2: "bar"
    })
];
于 2012-10-07T23:47:55.497 に答える