Cố gắng hiểu cách thức hoạt động của phiên bản CoffeeScript và biến lớp học mà tôi đi kèm với mã này (và kết quả có trong nhận xét).Đóng gói và truy cập biến thể 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 '------------'
Có một số điều kỳ lạ xảy ra ở đây:
x var Tôi đã chờ đợi để truy cập nó từ bất kỳ phương pháp nhưng x var không thể được truy cập từ bất kỳ phương pháp hoặc constructor (ReferenceError) . Tôi chỉ có thể truy cập nó từ một thể hiện của A hoặc B (i.x). Tại sao vậy?
@y var Tôi đã mong đợi nhận @y var value từ bất kỳ phương thức nào nhưng không có giá trị ở hầu hết các địa điểm (giá trị không xác định, không phải là ngoại lệ ReferenceError). @y có giá trị chỉ trên @ get3 và @ get4 (ví dụ phương pháp?). Nếu nó được xác định, tại sao tôi không thể có được giá trị của nó?
@y và @z var Cả hai @y và @z là các biến mẫu, nhưng vì @z được khởi tạo trong hàm tạo nên nó có một hành vi khác biệt. @y là hợp lệ trên @ get3 và @ get4 và @z là hợp lệ khi nhận và get2. Một lần nữa, những gì đang xảy ra ở đây?
Điều tôi thực sự bối rối bởi những hành vi này. Mã này có đúng không? Vậy, tôi có nên tìm hiểu thêm về JS do CS tạo ra không?
Tks
Tuyệt vời! Tôi nghĩ rằng điều quan trọng nhất là ở đây: "Là một hướng dẫn cơ bản, cố gắng không sử dụng @ bên ngoài của cơ quan chức năng và tất cả mọi thứ sẽ làm cho rất nhiều ý nghĩa hơn" True! –