2011-09-15 19 views
12

Duplicar posible:
Self-references in object literal declarationsobjeto hacer referencia a su propia propiedad en initilization

se puede hacer esto?(obviamente no en esta sintaxis)

var a = { 
    b : 10, 
    c : this.b * 2 // returns 'undefined' 
}; 

también he intentado

var a = { 
    b : 10, 
    c : a.b * 2 // throws error 'a is undefined' 
}; 

y

var a = { 
    b : 10, 
    c : b * 2 // throws error 'b is undefined' 
}; 

Tiene sentido para mí que estos valores no están definidos, no tengo terminado de definirlos. Sin embargo, me parece que habría una solución para la estructuración de un objeto de esa manera y tener c estar condicionada a b

+0

Considerando que está inicializando 'b' en tiempo de compilación, ¿por qué' c' estaría condicionado a ello? ¡Ya sabes lo que es! –

+0

Lo que he publicado es un ejemplo simplificado. No siempre sabré qué es 'b'. De lo contrario, no necesitaría tenerlo condicional. pensar 'b: function (x) {/ * hacer algunas cosas */return y;},' – rlemon

+0

@Chad 1. JS no está compilado, 2. es perfectamente normal inicializar una variable con una expresión basada en otra, y otros idiomas (por ejemplo, C) lo gestionan perfectamente bien. – Alnitak

Respuesta

10

Alternativamente, se puede utilizar una función de auto partida para darle un efecto similar a lo que busca:

var a = (function() { 
    var b = 10; 
    return { 
     b:b, 
     c:b*2 
    } 
})(); 

console.log(a.c); 
+3

Me gusta, parece casi * hacky * – rlemon

+1

@rlemon: si te gusta eso, ¿por qué no lo haces en dos partes para anularte a ti mismo de la sobrecarga de la función? De hecho, esto es desorden. Todavía está haciendo todo en dos pasos y, además, está llamando a una función innecesaria. – vol7ron

1

No usando la notación literal de objetos, pero se puede utilizar funciones para crearlo:

function Structure(value) { 
    this.b = value; 
    this.c = 2 * value; 
} 

var a = new Structure(10); 

o

function makeStructure(value) { 
    return {b:value, c:2*value}; 
} 

var a = makeStructure(10); 
Cuestiones relacionadas