Dưới đây là một giải pháp dựa trên một số câu trả lời khác ở đây cộng với https://stackoverflow.com/a/7579956/1484513. Nó lưu trữ các biến cá thể (không tĩnh) riêng trong một mảng riêng (tĩnh) và sử dụng một ID đối tượng để biết phần tử nào của mảng đó chứa dữ liệu thuộc về mỗi cá thể.
# Add IDs to classes.
(->
i = 1
Object.defineProperty Object.prototype, "__id", { writable:true }
Object.defineProperty Object.prototype, "_id", { get: -> @__id ?= i++ }
)()
class MyClass
# Private attribute storage.
__ = []
# Private class (static) variables.
_a = null
_b = null
# Public instance attributes.
c: null
# Private functions.
_getA = -> a
# Public methods.
getB: -> _b
getD: -> __[@._id].d
constructor: (a,b,@c,d) ->
_a = a
_b = b
# Private instance attributes.
__[@._id] = {d:d}
# Test
test1 = new MyClass 's', 't', 'u', 'v'
console.log 'test1', test1.getB(), test1.c, test1.getD() # test1 t u v
test2 = new MyClass 'W', 'X', 'Y', 'Z'
console.log 'test2', test2.getB(), test2.c, test2.getD() # test2 X Y Z
console.log 'test1', test1.getB(), test1.c, test1.getD() # test1 X u v
console.log test1.a # undefined
console.log test1._a # undefined
# Test sub-classes.
class AnotherClass extends MyClass
test1 = new AnotherClass 's', 't', 'u', 'v'
console.log 'test1', test1.getB(), test1.c, test1.getD() # test1 t u v
test2 = new AnotherClass 'W', 'X', 'Y', 'Z'
console.log 'test2', test2.getB(), test2.c, test2.getD() # test2 X Y Z
console.log 'test1', test1.getB(), test1.c, test1.getD() # test1 X u v
console.log test1.a # undefined
console.log test1._a # undefined
console.log test1.getA() # fatal error
... và vì vậy bạn phải làm điều đó như bạn sẽ làm điều đó trong JS. Dễ quên nó khi nó ẩn đằng sau tất cả đường đó, cảm ơn! – thejh
Điều đó thực sự riêng tư? Bạn vẫn có thể truy cập nó bên ngoài lớp học. a = Thing ('a') sau đó a.getName() trả về giá trị và a.getName = -> 'b' đặt nó. – Amir
'getName' không phải là riêng tư. 'name' là. – matyr