2012-06-26 22 views
0

我將獲取一個對象數組,並希望根據屬性在類內部設置實例變量。所以,如果我得到這個:以編程方式設置Javascript實例變量

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

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

在Ruby中我可以用戶instance_variable_set,但怎麼可以這樣在完成的Javascript對象?

回答

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,完美。我是在一個構造函數裏面做的,所以它變成了'this [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)) 
} 

如果創建了一個功能,你需要使用「這個」作爲該函數的引用,否則你可以使用的類「窗口「

相關問題