CoffeeScript örneğinin ve sınıf değişkeninin nasıl çalıştığını anlamaya çalışıyorum bu kodla geldim (ve sonuçlar yorumlarda yer alıyor).CoffeeScript Encapsulation ve Değişken Erişimi
class A
x: 1
@y: 2
constructor: (@z) ->
#console.log "const x", x #ReferenceError: x is not defined
console.log "constructor y", @y #undefined
console.log "constructor z", @z # = 3 for A and 6 for B
get:() ->
#console.log "get x", x #ReferenceError: x is not defined
console.log "get y", @y #undefined
console.log "get z", @z # = 3 for A and 6 for B
get2:() =>
#console.log "get2 x", x #ReferenceError: x is not defined
console.log "get2 y", @y #undefined
console.log "get2 z", @z # = 3 for A and 6 for B
@get3:() ->
#console.log "get3 x", x #ReferenceError: x is not defined
console.log "get3 y", @y # = 2
console.log "get3 z", @z #undefined
@get4:() =>
#console.log "get4 x", x #ReferenceError: x is not defined
console.log "get4 y", @y # = 2
console.log "get4 z", @z #undefined
class B extends A
constructor: (@w) ->
super(@w)
console.log '------A------'
i = new A 3
console.log "i.x", i.x # = 1
console.log "i.y", i.y #undefined
console.log "i.z", i.z # = 6
i.get()
i.get2()
A.get3()
A.get4()
console.log '------B------'
i = new B 6
console.log "i.x", i.x # = 1
console.log "i.y", i.y #undefined
console.log "i.z", i.z # = 6
console.log "i.w", i.w # = 6
i.get()
i.get2()
B.get3()
B.get4()
console.log '------------'
bazı garip şeyler Buradaki vardır:
x var ben herhangi bir yöntemle ama x var itibaren erişmek için bekliyordum herhangi bir yöntemle veya kurucusundan erişilemiyor(ReferenceError) . Sadece A veya B (i.x) örneğinden erişebiliyorum. Neden?
@y var @y var değerini herhangi bir yöntemden elde etmeyi bekliyordum, ancak çoğu yerde hiçbir değeri yok (tanımlanmamış değer, bir ReferenceError istisnası değil). @y sadece @ get3 ve @ get4 değerine sahiptir (örnek yöntemler?). Tanımlanırsa, neden değerini alamıyorum?
@y ve @z var Her ikisi de @y ve @z örnek değişkenlerdir, ancak @z yapıcıda başlatıldığı için farklı bir davranışı vardır. @y get3 ve @ get4'te geçerlidir ve @z get ve get2'de geçerlidir. Yine, burada neler oluyor?
Sorun şu ki bu davranışlarla gerçekten kafam karışmış durumda. Bu kod doğru mu? Yani, CS tarafından oluşturulan JS hakkında daha fazla bilgi almalı mıyım?
Tks
Harika! Bence en önemli şey burada: "Temel bir rehber olarak, fonksiyon gövdelerinin dışında @ kullanmamayı deneyin ve her şey çok daha anlamlı olacaktır" Doğru! –