2011-05-12 2 views
8

Я хочу установить два свойства, равные друг другу в одном объекте. Вот пример:Установка двух свойств, равных объявлению

var obj = { // I want to do something like this 
    a: function() { ... }, 
    b: alert, 
    c: a 
}; 

Очевидно, что не работает, и я должен сделать что-то вроде этого:

var obj = { 
    a: function() { ... }, 
    b: alert, 
}; 
obj.c = obj.a; 

Есть ли способ сделать это в декларации?

+0

См. Http://stackoverflow.com/questions/2787245/how-can-a-javascript-object-refer-to-values-in-itself, http://stackoverflow.com/questions/4618541/can- i-reference-other-properties-while-object-declaration-in-javascript и http://stackoverflow.com/questions/4616202/self-references-in-object-literal-declarations –

ответ

1
var obj = { 
    a: function() { alert("hello")}, 
    b: alert, 
    c: function(){return this.a()} 
}; 

obj.c(); 

Как уже упоминалось SLaks, это не будет работать, если функции обладают свойствами (например, прототип или arguments.callee).

+1

Это не сработает, если функции имеют свойства (например, 'prototype' или' arguments.callee'). – SLaks

+0

Спасибо, это хороший момент. Отредактировал мой ответ. –

1

Вы можете объявить функцию первого и использовать его с a & c:

function f() { ... } 

var obj = { 
    a: f, 
    b: alert, 
    c: f 
}; 
1

Вы можете поместить значение в отдельную переменную:

var temp = function() { ... }; 
var obj = { // I want to do something like this 
    a: temp, 
    b: alert, 
    c: temp 
}; 

Однако, вы не можете сделать лучше, чем что.

1

Если вы хотите сделать все внутри инициализатора объекта, то вы можете иметь одно свойство вызовите функцию от других и передавать любые аргументы, используя свойство Function.arguments:

var obj = { 
    a: function() { ... }, 
    b: alert, 
    c: function() { return this.a(arguments); } 
}; 

Однако, ваш лучший выбор может быть, чтобы создать переменную, содержащую анонимную функцию, а затем присвоить его значение для обоих свойств в вашем инициализатора объекта:

var fn = function() { ... }; 
var obj = { 
    a: fn, 
    b: alert, 
    c: fn 
}; 

Вы также можете сделать что-то подобное, но я бы с подходом, один выше:

var obj = { b: alert }; 
obj.a = obj.c = function() { ... }; 
Смежные вопросы