Eine Alternative wäre die Verwendung einer Getter/Setter-Methode.
Zum Beispiel, wenn Sie nur über das Lesen der berechnete Wert Pflege:
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!"
Der obige Code, aber lassen Sie nicht einen anderen Wert für key2 definieren.
So werden die Dinge ein bisschen komplizierter, wenn Sie auch den Wert von key2 neu definieren möchten. Es wird immer ein berechneter Wert sein. Das ist wahrscheinlich das, was Sie wollen.
Wenn Sie jedoch den Wert von key2 neu definieren möchten, benötigen Sie einen Platz, um seinen Wert unabhängig von der Berechnung zwischenzuspeichern.
Etwas wie folgt aus:
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]);
}
Eine weitere interessante Alternative ist, ein selbst Initialisierung Objekt zu verwenden:
var obj = ({
x: "it",
init: function(){
this.y = this.x + " works!";
return this;
}
}).init();
console.log(obj.y); //it works!
Sehr alte Versionen von Firefox (habe ich versucht, Firefox 4 und es gibt eine Warnung aus, sondern akzeptiert Es ermöglicht Ihnen, # N = und # N # zu verwenden, um auf vorhandene Objekte in demselben Ausdruck zu verweisen, aber dies funktioniert nicht für Grundelemente; Sie müssen diese nur duplizieren. – Neil
Eigentlich gibt es eine käsige Problemumgehung, Sie können das Primitiv boxen und dann auf den Boxed-Wert mit der scharfen Variable verweisen: 'var obj = {key1: # 1 = (neuer String (" it ")), key2: # 1 # + "funktioniert!" }; alert (obj.key2) ' – Neil
key2 ist innerhalb des Objekts definiert, während das Objekt definiert wird. Es gibt also noch keinen key1 wenn key2 definiert wird. Erst nach der Zuweisung existiert key1. Sie verweisen auf etwas, das noch nicht existiert. –