в javascript, при создании объекта, не в состоянии использовать методы других объектов - PullRequest
0 голосов
/ 08 августа 2011

при построении объекта с использованием методов из других объектов в качестве имени атрибута 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 ]

3 голосов
/ 08 августа 2011
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 голосов
/ 08 августа 2011

Вы можете создать свой собственный установщик свойств

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 голосов
/ 08 августа 2011
var o4 = { 'abc', r1.name() }

это должно быть:

var o4 = { 'abc': r1.name() }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...