在javascript中,构造对象时,无法使用其他对象的方法

时间:2011-08-08 13:02:02

标签: javascript object syntax methods

使用其他对象的方法构造对象作为属性名称get Syntax Error: Unexpected token .时 - 找不到正确的语法

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 s,而方法和变量则不是:

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

3 个答案:

答案 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;

答案 1 :(得分:0)

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

这个应该是:

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

答案 2 :(得分: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);