2011-09-15 31 views
12

Olası yinelenen üzerinde kendi özelliği başvuru:
Self-references in object literal declarations
Nesne initilization

Bu yapılabilir? (Besbelli değil bu sözdiziminde)

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

Ben de bu değerlerin tanımsız olduğunu bana mantıklı

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

ve

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

denedi, unutmadım onları tanımlamayı bitirdi. Ancak böyle bir nesneyi yapılandırarak ve c

+0

"b" yi derleme zamanında başlattığınızı düşünürsek, neden bunun üzerinde koşullu olabilir? Zaten ne olduğunu biliyorsun! –

+0

Gönderdiğim yazı basitleştirilmiş bir örnektir. Her zaman b'nin ne olduğunu bilmeyeceğim. Aksi takdirde şartlı şartlara sahip olmam gerekmeyecek. b: function (x) {/ * bazı şeyler yapmak */return y;}, ' – rlemon

+0

@Chad 1. JS derlenmez, 2. bir değişkeni diğerine dayalı bir ifadeyle başlatmak normaldir ve diğer diller (örneğin C) mükemmel şekilde yönetir. – Alnitak

cevap

10

, size vermek için bir öz başlangıç ​​işlevini kullanabilirsiniz bir benzer etkiler ne arıyorsun:

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

console.log(a.c); 
+3

Bunu sevdim, neredeyse gözüküyor * hacky * – rlemon

+1

@rlemon: eğer hoşuna giderse, neden iş yükünü kendinden atmak için iki parça halinde yapmıyorsun? Aslında, bu dağınıklıktır. Hala her şeyi iki adımda yapıyor ve bunun üzerine gereksiz bir işlevi çağırıyorsunuz. – vol7ron

1

b nesne değişmezi gösterimi kullanılarak Değil bağlı olarak aktarılacak olan bir çözümü var olacak gibi geliyor bana, ama bunu oluşturmak için işlevleri kullanabilirsiniz:

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

var a = new Structure(10); 

veya alternatif olarak

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

var a = makeStructure(10);