Una alternativa sería utilizar un método getter/setter.
Por ejemplo, si sólo se preocupan por la lectura del valor calculado:
var book = {}
Object.defineProperties(book,{
key1: { value: "it", enumerable: true },
key2: {
enumerable: true,
get: function(){
return this.key1 + " works!";
}
}
});
console.log(book.key2); //prints "it works!"
El código anterior, sin embargo, no se le permitirá definir otro valor para clave2.
Por lo tanto, las cosas se vuelven un poco más complicadas si también desea redefinir el valor de key2. Siempre será un valor calculado. Lo más probable es que eso es lo que quieres.
Sin embargo, si desea poder redefinir el valor de key2, necesitará un lugar para almacenar en caché su valor independientemente del cálculo.
Algo como esto:
var book = { _key2: " works!" }
Object.defineProperties(book,{
key1: { value: "it", enumerable: true},
_key2: { enumerable: false},
key2: {
enumerable: true,
get: function(){
return this.key1 + this._key2;
},
set: function(newValue){
this._key2 = newValue;
}
}
});
console.log(book.key2); //it works!
book.key2 = " doesn't work!";
console.log(book.key2); //it doesn't work!
for(var key in book){
//prints both key1 and key2, but not _key2
console.log(key + ":" + book[key]);
}
Otra alternativa interesante es el uso de un objeto de auto-inicialización:
versiones
var obj = ({
x: "it",
init: function(){
this.y = this.x + " works!";
return this;
}
}).init();
console.log(obj.y); //it works!
muy antigua de Firefox (He intentado Firefox 4 y le da una advertencia pero acepta it) le permiten usar # N = y # N # para referirse a objetos existentes en la misma expresión, pero esto no funciona para las primitivas; solo tienes que duplicarlos. – Neil
En realidad, hay una solución cursi, puede colocar el primitivo en la caja y luego referirse al valor en caja con la variable aguda: 'var obj = {key1: # 1 = (new String (" it ")), key2: # 1 # + "funciona" }; alerta (obj.key2) ' – Neil
key2 se define dentro del objeto mientras se está definiendo el objeto. Por lo tanto, aún no hay una clave1 cuando se está definiendo key2. Solo después de la asignación existe la clave1. Estás haciendo referencia a algo que aún no existe. –