我将获得一个对象数组,并希望在基于属性的类中设置实例变量。所以如果我得到这个:
ary = [{type: 'walrus', name: 'GorbyPuff'}, {type: 'humanoid', occupation: 'KingSlayer'}]
我想初始化一个对象,@walrus == ary[0]
其中@humanoid == ary[1]
在 Ruby 中,我可以使用 instance_variable_set,但是如何在 Javascript 中实现呢?
我将获得一个对象数组,并希望在基于属性的类中设置实例变量。所以如果我得到这个:
ary = [{type: 'walrus', name: 'GorbyPuff'}, {type: 'humanoid', occupation: 'KingSlayer'}]
我想初始化一个对象,@walrus == ary[0]
其中@humanoid == ary[1]
在 Ruby 中,我可以使用 instance_variable_set,但是如何在 Javascript 中实现呢?
JS 中没有什么可以为您执行此操作,只需执行一个循环来构建您想要的对象:
ary = [{type: 'walrus', name: 'GorbyPuff'}, {type: 'humanoid', occupation: 'KingSlayer'}]
instances={}
for(x=0;x<ary.length;x++) instances[ary[x].type]=ary[x]
document.write(instances.walrus.name) //GorbyBuff
document.write(instances.humanoid.occupation) //KingSlayer
我不确定我是否能得到你想要达到的目标,但最简单的方法是:
var theObj = {};
for(var i=0;i<ary.length;i++)
{
theObj[ary[i].type] = ary[i];
}
这里的担心是,通过改变ary
变量你会无意中改变theObj
:
console.log(theObj.walrus.name);//Outputs: GorbyPuff
ary[0].name = 'Nips!';
console.log(theObj.walrus.name);//Outputs: Nips! <-- objects are passed by reference, always
如果ary
变量是函数作用域的一部分,而结果对象是它的返回值,则不必担心。但是,如果两者都是全局范围的一部分(它们不应该这样做,这是不好的做法),这就会成为一个问题。
因此,我提出了这种方法:
var obj = {};
var i;
while (ary.length !== 0)
{
i = ary.splice(0,1)[0];//removes element from array
if (i.hasOwnProperty('type'))//always best to check the property you're going to use is there
{
obj[i.type] = i;
}
}
如果你想使用该对象数组作为原型,你可以这样做:
var Walrus = function(){};
Walrus.prototype=ary[0];
var aWalrus = new Walrus(); // creates a new Walrus. aWalrus.name => GorbyPuff
在 Javascript the Good Parts 中,Douglas Crawford 描述了一种更通用的方法:
if (typeof Object.create !== 'function') {
Object.create = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
}
您可以像这样使用它:
var aWalrus = Object.create(ary[0]);
这是您想要的示例:
// the class:
function MyClass(){
// stuff
}
// the data object
var o = [
{type:"MyClass",name:"a name"}
]
// how to instantiate:
var instances = [];
for(var i=0;i<o.length;i++){
if(typeof this[o[i].type] == "function")
instances.push(new this[o[i].type](o[i].name))
}
如果在函数中创建类,则需要使用“this”作为对该函数的引用,否则可以使用“window”