以编程方式设置Javascript实例变量

时间:2012-06-26 15:54:22

标签: javascript metaprogramming instance-variables

我将获得一个对象数组,并希望根据属性在类中设置实例变量。所以,如果我得到这个:

ary = [{type: 'walrus', name: 'GorbyPuff'}, {type: 'humanoid', occupation: 'KingSlayer'}]

我想初始化@walrus == ary[0]@humanoid == ary[1]

的对象

在Ruby中,我可以使用instance_variable_set,但是如何在Javascripts中实现呢?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我不确定我是否得到了你想要的东西,但最简单的方法是:

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;
    }
}

答案 2 :(得分:0)

如果要将该对象数组用作原型,可以执行以下操作:

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

答案 3 :(得分: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”