初始化JavaScript对象及其属性的好方法?

时间:2012-10-07 23:44:44

标签: javascript

我知道我可以初始化一个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';

现在我希望上面原始代码中的两个项目都是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];

编辑:

我还应该注意,我的原型还包含一些共享的功能。实际上我有三个嵌套深度的数组,所以更像是:

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

这就是为什么我希望像这样初始化所有内联而不是逐行设置每个属性。

4 个答案:

答案 0 :(得分: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'
  }),
];

答案 1 :(得分: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");

答案 2 :(得分: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'
    })
];

答案 3 :(得分: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"
    })
];