Ecco una soluzione che si basa su molte delle altre risposte qui oltre a https://stackoverflow.com/a/7579956/1484513 . Memorizza le variabili di istanza privata (non statica) in un array di classe privata (statico) e utilizza un ID oggetto per sapere quale elemento di quell'array contiene i dati appartenenti a ciascuna istanza.
(->
i = 1
Object.defineProperty Object.prototype, "__id", { writable:true }
Object.defineProperty Object.prototype, "_id", { get: -> @__id ?= i++ }
)()
class MyClass
__ = []
_a = null
_b = null
c: null
_getA = -> a
getB: -> _b
getD: -> __[@._id].d
constructor: (a,b,@c,d) ->
_a = a
_b = b
__[@._id] = {d:d}
test1 = new MyClass 's', 't', 'u', 'v'
console.log 'test1', test1.getB(), test1.c, test1.getD()
test2 = new MyClass 'W', 'X', 'Y', 'Z'
console.log 'test2', test2.getB(), test2.c, test2.getD()
console.log 'test1', test1.getB(), test1.c, test1.getD()
console.log test1.a
console.log test1._a
class AnotherClass extends MyClass
test1 = new AnotherClass 's', 't', 'u', 'v'
console.log 'test1', test1.getB(), test1.c, test1.getD()
test2 = new AnotherClass 'W', 'X', 'Y', 'Z'
console.log 'test2', test2.getB(), test2.c, test2.getD()
console.log 'test1', test1.getB(), test1.c, test1.getD()
console.log test1.a
console.log test1._a
console.log test1.getA()