Пытаясь понять, как работает экземпляр CoffeeScript и переменная класса, я пришел с этим кодом (результаты приведены в комментариях).
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 '------------'
Здесь происходят некоторые странные вещи:
х вар
Я ожидал получить к нему доступ из любого метода, но x var не может быть доступен из любого метода или конструктора (ReferenceError). Я могу получить к нему доступ только с экземпляра A или B (i.x). Почему это так?
@ y var
Я ожидал получить значение @y var из любого метода, но он не имеет значения в большинстве мест (неопределенное значение, не исключение ReferenceError). @y имеет значение только для @ get3 и @ get4 (методы экземпляра?). Если оно определено, почему я не могу получить его значение?
@ y и @z var
И @y, и @z являются переменными экземпляра, но поскольку @z был инициализирован в конструкторе, он имеет дифференцированное поведение. @y действует на @ get3 и @ get4, а @z действует на get и get2. Опять же, что здесь происходит?
Дело в том, что меня действительно смущает такое поведение. Этот код правильный? Итак, я должен узнать больше о JS генерируется CS?
Tks