2012-06-26 5 views
0

Я собираюсь получить массив объектов и хочу установить переменные экземпляра внутри класса на основе свойства. Так что, если я получаю это:Программные переменные экземпляра Javascript

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

Я хочу, чтобы инициализировать объект, где @walrus == ary[0] и @humanoid == ary[1]

В Ruby я мог бы пользователь instance_variable_set, но как это может быть реализовано в Javascripts?

ответ

1

я не уверен, если я получаю то, что вы пытаетесь acchieve, но самый простой способ сделать это было бы:

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

Javascript передает все объекты по ссылке, поэтому любые изменения, внесенные в объекты в ary, также будут сделаны с любыми ссылками на него , –

+0

boomsauce, безупречный. Я делал это внутри конструктора, поэтому оказалось, что это «это [obj ['type]] = obj' Пока вы уверены, что они уникальны, вы хороши – Chris

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 
+0

Я создаю экземпляр экземпляра класса, поэтому все экземпляры будут одного типа. – Chris

0

Если вы хотите использовать этот массив объектов в качестве прототипов, вы можете сделать это:

var Walrus = function(){}; 
Walrus.prototype=ary[0]; 
var aWalrus = new Walrus(); // creates a new Walrus. aWalrus.name => GorbyPuff 

В JavaScript хорошие части, Дуглас Кроуфорд описывает более общий способ сделать это:

if (typeof Object.create !== 'function') { 
    Object.create = function (o) { 
     var F = function() {}; 
     F.prototype = o; 
     return new F(); 
    }; 
} 

Что вы можете использовать следующим образом:

var aWalrus = Object.create(ary[0]); 
+0

Ну, как вы сказали в ваш ответ, вопрос был неясным. Я интерпретировал это по-другому. Может быть, он просто хотел var x = ary [0] ... Не знаю. Похоже, он не очень хорошо разбирается в javascript-объектах, поэтому этот ответ может помочь ему, даже если это не по теме. – AlexMA

+0

Кроме того, он сказал: «Задайте переменные экземпляра внутри класса на основе свойства», и я интерпретировал класс как нечто вроде прототипа. – AlexMA

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

При создании классов в функции нужно использовать «это» в качестве ссылки на эту функцию, иначе вы можете использовать " window "