2013-01-05 15 views
5

Ich erstelle eine Node.js-Anwendung, die objektorientiertes coffeescript verwendet.Coffeescript: Instanz der Klasse dynamisch erstellen Eine Methode wird aufgerufen

Ich habe ein super class mit einer statischen Methode wie:

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

eine Unterklasse gibt wie

ist
class User extends RedisObject 

Wenn ich rufe find() auf dem User class ich es will stattdessen eine Instanz von User passieren von RedisObject auf die Callback-Funktion.

Ich habe versucht, dies zu realisieren, indem die Klassennamen der tatsächlichen Klasse immer die Methode unter Verwendung von aufgerufen wird

@constructor.name 

und eval() eine Instanz davon zu erzeugen - aber das Problem ist, dass die Unterklasse aus der Oberklasse undefiniert sein.

Wie kann ich das Verhalten beim Abrufen verschiedener Typen von Instanzen, die von der find-Methode zurückgegeben werden, abhängig davon, an welcher Klasse es aufgerufen wird, realisieren, ohne es in jeder Unterklasse zu überschreiben?

Antwort

6

Ich bin kein Experte in CoffeeScript, aber würde das nicht funktionieren?

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" 

Zumindest scheint der obige Test zu bestehen.

+0

danke! funktioniert perfekt. – Matthias

+1

Btw, das "neue dies" ist kein dokumentiertes Feature, ich kann es nicht im Abschnitt Klassen finden. Es ist wirklich nützlich, es sollte angegeben werden. – Ciantic

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

und in der Unterklasse

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

das ist, was ich tun würde, wenn es nicht 100% dynamisch.

Verwandte Themen