初始化JavaScript对象及其属性数组的好方法?
我知道我可以初始化一个JS对象数组,如下所示:初始化JavaScript对象及其属性数组的好方法?,javascript,Javascript,我知道我可以初始化一个JS对象数组,如下所示: var things = [ { prop1: 'foo', prop2: 'bar' }, { prop1: 'foo', prop2: 'bar' } ]; 我想我会将这些类型称为“匿名”类型(对不起,我使用的是C#/.NET语言) 如果我希望这些是同一个原型呢?所以我定义了一个构造函数: var Thing = function Thing() { }; Thing.prototype.pr
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
s。有什么好办法吗
如果我猜的话,我会说:
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层,所以更像:
{
[
{
[
{},
{}
]
},
{
[
{},
{}
]
}
]
}
这就是为什么我希望像这样内联初始化所有内容,而不是一行一行地设置每个属性。下面的方法可能有效,这也是您希望避免的吗
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"
})
];
您没有使用您的“构造函数”。首选在构造函数中初始化值:
var Thing = function Thing(prop1, prop2) {
this.prop1 = prop1;
this.prop2 = prop2;
};
然后做:
var thing1 = new Thing("foo", "bar");
var thing2 = new Thing("foo", "bar");
在这种情况下,我向对象添加了一个“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'
})
];
这不会改变每个对象实例所基于的原型吗?原型也有一些共享的函数,所以它不会也失去它们吗?@CodingWithSpike是的,它会=/你不能更改实例的原型。构造函数具有
.prototype
属性,该属性引用使用此构造函数创建的对象的隐藏[[prototype]]]
属性。您无法(以标准方式)更改此属性,因此第一个代码段所做的是将名为prototype
的属性添加到必须由thing1.prototype.prop1
访问的实例中,而thing1.prop1
与thing1.prop1
无关,但这有点奇怪,因为我的一些属性也是数组,所以我最终得到了类似的东西:newone(“foo”),[newtwo([new Three(),new Three()]),newtwo([new Three(),new Three()]),“bar”)
,看起来很难看。我想你可能是对的。为了可读性,我想我只是想保留属性名。@CodingWithSpike,如果你在创建一个新类时遇到了麻烦,你应该确定你已经为该类上的方法准备了一个用例。否则,最好使用对象和数组文字。此外,大量静态数据最好作为JSON数据源。拥有.config()
和在构造函数本身中实现有什么区别吗<代码>函数Thing(data){for(vari in data)…}这基本上是@alcidesqueroz answer。主要区别在于,在构造函数上实现它时,每次创建对象时,都会在对象上执行迭代,不管您是否需要它,使用.config()
method您会隐式地要求它。此外,您可以将方法.config()
添加到任何现有类中(但我不建议您扩展本机类型),并将其标记为答案,因为它在我的情况下工作得最好。它还允许我执行可选属性,如:function Thing(params){this.name=params.hasOwnProperty(“name”)?params.name:“一些默认”}
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'
})
];