2012-10-07 60 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深,所以它更多的东西一样:

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

这就是为什么我为希望只是初始化所有内嵌这样的,而不是由线路设置每个属性线。

回答

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

标记为答案,因为它在我的情况下效果最好。它也允许我做可选属性,如:'函数Thing(params){this.name = params.hasOwnProperty(“name”)? params.name:“有些默认”; }' – 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

@CodingWithSpike是的,它会=/ – jeremy

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"); 
+0

我开始了这条路,但它有点奇怪,因为我的一些属性也是数组,所以我最终得到了类似于:'new One(“foo”,[new Two([new Three(), new Three()]),new Two([new Three(),new Three()])],“bar”)'看起来很丑。我认为你可能是对的。为了可读性,我想我只是试图保留属性名称。 – CodingWithSpike

+1

@CodingWithSpike,如果你经历了创建一个新类的麻烦,你应该确定你已经有了该类方法的用例。否则,你最好用对象和数组文字。此外,大量的静态数据可能更适合留作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()'并在构造函数本身中执行它有区别吗? '函数Thing(data){for(var i in data) ...}这基本上就是@alcidesqueiroz答案。 – CodingWithSpike

+0

那么,主要的区别在于,在构造函数上执行它时,每次创建“Thing”时都会执行对该对象的迭代,如果需要或不需要,使用'.config()'方法隐式询问为了它。 –

+0

此外,您可以将'.config()'方法添加到任何现有的类(但我不建议您扩展本机类型) –