Bir JavaScript nesnesi, kendisindeki değerlere nasıl başvurabilir?
Diyelim ki elimde aşağıdaki JavaScript var:
var obj = {
key1 : "it ",
key2 : key1 + " works!"
};
alert(obj.key2);
Bu, "key1 tanımlı değil" hatası veriyor. Denedim
this.key1
this[key1]
obj.key1
obj[key1]
this["key1"]
obj["key1"]
ve onlar asla tanımlanmış gibi görünmüyor.
key2'nin key1'in değerine atıfta bulunmasını nasıl sağlayabilirim?
Cevap #1
Belki bir işlevin özniteliğini kaldırmayı düşünebilirsiniz. Yani şöyle bir şey:
var obj = {
key1: "it ",
key2: function() {
return this.key1 + " works!";
}
};
alert(obj.key2());Cevap #2
Bu, literal yerine yapıcı fonksiyon kullanılarak gerçekleştirilebilir
var o = new function() {
this.foo = "it";
this.bar = this.foo + " works"
}
alert(o.bar)
Cevap #3
Bir nesneyi başlatmadan önce onun bir özelliğine başvuramazsınız; harici bir değişken kullanın.
var key1 = "it";
var obj = {
key1 : key1,
key2 : key1 + " works!"
};
Ayrıca, bu bir "JSON nesnesi" değil; bu bir Javascript nesnesidir. JSON, bir nesneyi bir dize ile temsil etme yöntemidir (bu dize geçerli Javascript kodu olabilir).
Cevap #4
Bir alternatif, getter/setter metodları kullanmak olabilir.
Örneğin, sadece hesaplanmış değeri okumakla ilgileniyorsanız:
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!"
Yukarıdaki kod ise, key2 için başka bir değer tanımlamanıza izin vermez.
Yani, key2'nin değerini yeniden tanımlamak isterseniz işler biraz daha karmaşık hâle gelir. Bu her zaman hesaplanmış bir değer olacaktır. Muhtemelen istediğiniz budur.
Ancak, key2'nin değerini yeniden tanımlayabilmek istiyorsanız, değerini hesaplamadan bağımsız olarak önbelleğe alabileceğiniz bir yere ihtiyacınız olacak.
Birkaç açıdan böyle:
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]);
}
Bir diğer ilginç alternatif, kendi kendini başlatan bir nesne kullanmaktır:
var obj = ({
x: "it",
init: function(){
this.y = this.x + " works!";
return this;
}
}).init();
console.log(obj.y); //it works!
Cevap #5
Çünkü obj öğesini tanımlayan ifade bitmemiş, key1 henüz yok. Bu çözümü düşünün:
var obj = { key1: "it" };
obj.key2 = obj.key1 + ' ' + 'works!';
// obj.key2 is now 'it works!'
Cevap #6
Bu bir JSON nesnesi değil, nesne literal notasyonu ile oluşturulmuş bir Javascript nesnesidir. (JSON, veri alışverişi için bir metinsel gösterimdir (daha fazla). Eğer JavaScript kaynak kodu ile uğraşıyorsanız ve bir dize ile uğraşmıyorsanız, JSON ile uğraşmıyorsunuz demektir.)
Nesne başlatıcısı içinde, başlatılan nesnenin başka bir anahtarına başvurmanın bir yolu yoktur, çünkü başlatıcı bitene kadar oluşturulan nesneye bir referans almanın bir yolu yoktur. (Bu durum için this gibi bir anahtar kelime yoktur.)
Cevap #7
Fonksiyonun içindeyken this yerine obj'ye de başvurabilirsiniz.
var obj = {
key1: "it",
key2: function(){return obj.key1 + " works!"}
};
alert(obj.key2());
