2011-08-08 10 views
0

構建使用來自其他對象方法的對象時,作爲一個屬性的名稱得到Syntax Error: Unexpected token . - 無法找到正確的語法在JavaScript中,構造一個對象,無法使用其他對象的方法時

 
var R = function(a) { this.arg = a; }; 
R.prototype.name = function() { return this.arg; } 

var r1 = new R('abc'); 
var name1 = r1.name();  // => "abc" 

var o1 = { 'abc': r1 }  // this works with constant 
var o2 = { name1: r1 }  // does not work with variable (see answer) 
var o3 = { r1.name(): r1 } // this fails - syntax 
var o4 = { 'abc': r1.name() } // this works 

試圖{ (r1.name()): r1 },但也失敗了。


請注意整數作爲bareword小號評估,而方法和變量是不是:

 
var o5 = { e.1: 123 }   // fails 
var o6 = { 'e.1': 123 }  // succeeds 
var o7 = { 1: 123 }   // succeeds 
var o8 = { '1': 123 }   // same as o7 
+0

可能重複[如何使用另一個對象的關鍵變量值?] (http://stackoverflow.com/questions/2224542/how-to-use-a-variable-value-for-the-key-of-otherother-object) –

+0

是一個重複的 - 有點簡單,但相同的答案 –

回答

3
var o2 = { name1: r1 }  // this works with variable 

此具有相同的含義:

var o2 = { 'name1': r1 } 

換句話說,它仍然是治療name1爲文字字符串。對象文字中的鍵必須是是常數或所謂的「裸號」 - 這是對語言的限制。變量和函數調用不能用作對象文本中的鍵(但它們可以用作值)。使用變量似乎可以工作,但變量名稱將用作鍵而不是變量的值。

你將不得不做這樣的事情:

var o2 = {}; 
o2[name1] = r1; 

var o3 = {}; 
o3[r1.name()] = r1; 
+0

好 - 這是有道理的。我想它沒有問沒有'裸字'功能。 :-)有時這種語言只是喜歡你的鍵盤 –

+0

這樣的功能會做什麼?裸詞是一種語言元素,而不是某種特殊的價值。 – cdhowie

+0

我明白了 - 我的蹩腳笑話 –

0
var o4 = { 'abc', r1.name() } 

這一項應該是:

var o4 = { 'abc': r1.name() } 
+0

對!問題出在屬性名稱一側。將編輯上述 –

+0

說明我認爲cdhowie有答案 - 對象文字語法沒有動態鍵。 –

0

你可以創建自己的屬性設置

function setProperty (prop,val,obj) { 
    if (typeof prop === "undefined" || typeof val === "undefined") return undefined; 
    if (typeof obj === "undefined") obj = {}; 
    obj[prop] = val; 
    return obj; 
} 

// use 1 
var o1 = setProperty(r1.name(),r1); 

// use 2 
var o2 = {}; 
setProperty(r1.name(),r1,o2); 
+0

好主意,但我認爲如果我這樣做,我會寫一個帶有參數'arg0 = name0,arg1 = value1,....'的'createObject'來返回一個對象。 –

+0

您正在使用與「Object」或甚至「x = function(){}」不同的基礎對象類型「{}」。以上所做的就是設置一個屬性,如果它不存在,首先創建它。 – vol7ron

相關問題