Хороший способ инициализировать массив объектов JavaScript и их свойства?

Я знаю, что могу инициализировать массив объектов JS следующим образом:

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

Я бы назвал эти "анонимные" типы (извините, я использую язык С#/. NET).

Что, если я хочу, чтобы они были одного прототипа? Поэтому я определил конструктор:

var Thing = function Thing() {
};

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

Теперь я хочу, чтобы оба элемента в моем исходном коде были Thing s. Есть ли хороший способ сделать это?

Если бы я догадался, я бы сказал, может быть, что-то вроде:

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

В основном это синтаксис инициализатора объекта С#. Я пытаюсь избежать:

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

Edit:

Я также должен отметить, что мои прототипы также содержат некоторые общие функции. Также на самом деле у меня есть массивы, вложенные в 3 глубины, так что это нечто более похожее:

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

Вот почему я так надеялся, что просто запустил все встроенное, как это, и не устанавливая каждое свойство по строкам.

Ответы

Ответ 1

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

Вы не используете свой "конструктор". Его предпочтительнее инициализировать значения в вашем CONSTRUCTOR:

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

а затем выполните:

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

Ответ 3

В этом случае я добавляю к объекту метод "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'
    })
];

Ответ 4

Может случиться, что вы тоже этого хотите избежать?

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"
    })
];