【问题标题】:in javascript, when constructing an object, unable to use other objects' methods在javascript中,构造对象时,无法使用其他对象的方法
【发布时间】:2011-10-22 09:24:49
【问题描述】:

当使用来自其他对象的方法作为属性名称构造对象时,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 } // 这适用于常量 var o2 = { name1: r1 } // 不适用于变量(见答案) var o3 = { r1.name(): r1 } // 失败 - 语法 var o4 = { 'abc': r1.name() } // 这行得通

已尝试{ (r1.name()): r1 },但同样失败。


请注意 strings 和 integers 被评估为 barewords 而方法和变量不是:

var o5 = { e.1: 123 } // 失败 var o6 = { 'e.1': 123 } // 成功 var o7 = { 1: 123 } // 成功 var o8 = { '1': 123 } // 和 o7 一样

【问题讨论】:

标签: javascript object syntax methods


【解决方案1】:
var o2 = { name1: r1 }        // this works with variable

这与以下含义相同:

var o2 = { 'name1': r1 }

换句话说,它仍然将name1 视为文字字符串。对象文字中的键必须是一个常量或所谓的“裸词”——这是语言的限制。变量和函数调用不能用作对象字面量中的键(但它们可以用作值)。使用变量似乎可以工作,但变量名将用作键而不是变量的值。

您必须执行以下操作:

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

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

【讨论】:

  • 好的 - 这是有道理的。我想它不用问没有bareword 功能。 :-) 有时这种语言只是喜欢你键盘
  • 这样的函数能做什么?裸词是一种语言元素,而不是某种特殊值。
  • 我明白了——这是我的蹩脚笑话
【解决方案2】:
var o4 = { 'abc', r1.name() }

这个应该是:

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

【讨论】:

  • 对!问题出在属性名称方面。将编辑上面的描述
  • 我认为 cdhowie 有答案——对象文字语法中没有动态键。
【解决方案3】:

您可以创建自己的属性设置器

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

【讨论】:

  • 好主意,但我想如果我这样做,我会写一个 createObject 和参数 arg0=name0, arg1=value1, .... 来返回一个对象。
  • 您正在使用与Object 甚至x = function (){} 不同的基础对象类型{}。上面所做的只是设置一个属性,如果它不存在则首先创建它。
猜你喜欢
  • 2016-01-06
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 2017-12-15
相关资源
最近更新 更多