2011-05-12 9 views
8

Chcę ustawić dwie właściwości równe sobie w jednym obiekcie. Oto przykład:Ustawianie dwóch właściwości równych w deklaracji

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

Oczywiście, że nie działa i muszę zrobić coś takiego:

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

jest jakiś sposób, aby to zrobić w deklaracji?

+0

Zobacz http://stackoverflow.com/questions/2787245/how-can-a-javascript-object-refer-to-values-in-self, http://stackoverflow.com/questions/4618541/can- i-reference-other-properties-podczas-obiektu-deklaracji-in-javascript i http://stackoverflow.com/questions/4616202/self-references-in-object-literal-declarations –

Odpowiedz

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

obj.c(); 

Jak SLaks wspomniano, to nie będzie działać, jeśli te funkcje mają właściwości (np prototypowych lub arguments.callee).

+1

To nie zadziała, jeśli funkcje mają własności (np. 'prototype' lub' arguments.callee'). – SLaks

+0

Dzięki, to dobra uwaga. Zmieniono moją odpowiedź. –

1

Można najpierw zadeklarować funkcję i używać go z a & c:

function f() { ... } 

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

można umieścić wartość w osobnej zmiennej:

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

Jednak nie można zrobić nic lepszego niż że.

1

Jeśli chcesz zrobić wszystko wewnątrz inicjatora obiektu, wówczas można mieć jedno połączenie właściwości funkcję z drugą i przekazywać żadnych argumentów za pomocą właściwości Function.arguments:

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

Jednak najlepszym może być stworzenie zmienną zawierającą funkcję anonimową pierwszy, a następnie przypisać jej wartość obu nieruchomości w inicjatora obiektu:

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

można też zrobić coś takiego, ale pójdę z podejściem jednym powyżej:

var obj = { b: alert }; 
obj.a = obj.c = function() { ... }; 
Powiązane problemy