2013-01-05 139 views
5

上調用方法我正在使用面向對象的coffeescript構建Node.js應用程序。Coffeescript:動態創建類的實例在

我有一個super class與像一個靜態方法:

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

有沒有像

class User extends RedisObject 

當我呼籲User class我想find()一個子類,它傳遞的User一個實例,而不是RedisObject到回調函數。

我試圖得到實際的類的類名來實現這種方法是通過使用

@constructor.name 

,並使用eval()從它生成一個實例呼籲 - 但問題是,子類在超類內未定義。

如何才能實現獲取find方法返回的不同類型實例的行爲,具體取決於調用哪個類,而不必在每個子類中重寫它?

回答

6

我不是CoffeeScript的專家,但不會這項工作?

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" 

至少上述測試似乎通過。

+0

謝謝!完美的作品。 – Matthias

+1

順便說一句,「新這個」沒有記錄的功能,我無法從類部分找到它。這是非常有用的,它應該被指定。 – Ciantic

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

,並在子類

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

這就是我會做雖然不是100%的動態。