2013-01-05 5 views
5

Sto costruendo un'applicazione Node.js utilizzando un coffeescript orientato agli oggetti.Coffeescript: crea dinamicamente l'istanza della classe viene chiamato un metodo su

Ho un super class con un metodo statico come:

class RedisObject 
@find: (id, cb) -> 
    client.HGETALL "#{@className()}|#{id}", (err, obj) => 
     unless err 
     cb(new RedisObject(obj, false)) 

C'è una sottoclasse come

class User extends RedisObject 

Quando chiamo find() sul User class lo voglio passare un'istanza di User invece di RedisObject alla funzione di callback.

ho cercato di realizzare questo da ottenere il nome di classe della classe attuale il metodo viene chiamato al sistema utilizzando

@constructor.name 

e utilizzare eval() per generare un'istanza da esso - ma il problema è che la sottoclasse sarà essere indefinito all'interno della superclasse.

Come posso realizzare il comportamento di ottenere diversi tipi di istanze restituite dal metodo find a seconda della classe in cui viene chiamato, senza dover sovrascriverlo in ciascuna sottoclasse?

risposta

6

Non sono un esperto di CoffeeScript, ma non funzionerebbe?

class RedisObject 
    whoami:() -> "I am a RedisObject" 
    @find:() -> 
    new this() 

class User extends RedisObject 
    whoami:() -> "I am a User" 

console.log RedisObject.find().whoami() // -> "I am a RedisObject" 
console.log User.find().whoami()  // -> "I am a User" 

Almeno il test precedente sembra passare.

+0

grazie! funziona perfettamente – Matthias

+1

Btw, la funzione "nuovo questo" non è documentata, non riesco a trovarla nella sezione Classi. È davvero utile, dovrebbe essere specificato. – Ciantic

0
@find: (id, cb,klass=RedisObject) -> 
    client.HGETALL "#{@className()}|#{id}", (err, obj) => 
     unless err 
     cb(new klass(obj, false)) 

e nella classe sub

@find: (id, cb,klass=User) -> 
    super(id,cd,klass) 

questo è quello che avrei fatto anche se non è al 100% dinamica.

Problemi correlati