Próbuję zrozumieć, jak działa instancja klasy i instancji klasy CoffeeScript, więc przyszedł z tym kodem (a wyniki są w komentarzach).Enkapsulacja CoffeeScript i zmienny dostęp
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 '------------'
Istnieją pewne dziwne rzeczy się tu dzieje:
x var Spodziewałem się do niego dostęp z dowolnego sposobu x var lecz nie mogą być dostępne z dowolnej metody lub konstruktora (ReferenceError) . Mogę uzyskać do niego dostęp tylko z instancji A lub B (i.x). Dlaczego?
@y var Spodziewałem się uzyskać wartość @y var z dowolnej metody, ale nie ma ona wartości w większości miejsc (wartość niezdefiniowana, a nie wyjątek ReferenceError). @y ma wartość tylko na @ get3 i @ get4 (metody instancji?). Jeśli jest zdefiniowany, dlaczego nie mogę uzyskać jego wartości?
@y i @z var Zarówno @y jak i @z są zmiennymi instancji, ale ponieważ @z został zainicjowany w konstruktorze, ma on zróżnicowane zachowanie. @ y jest poprawne na @ get3 i @ get4, a @z jest poprawne na get i get2. Znowu, co się tutaj dzieje?
Chodzi o to, że jestem naprawdę zdezorientowany tymi zachowaniami. Czy ten kod jest poprawny? Czy powinienem dowiedzieć się więcej o JS generowanym przez CS?
TKS
Świetnie! Myślę, że najważniejsza jest tutaj: "Jako podstawowy przewodnik, staraj się nie używać @ poza ciałami funkcyjnymi i wszystko będzie miało więcej sensu" Prawda! –