【问题标题】:Coffeescript: dynamically create instance of the class a method is called onCoffeescript:动态创建调用方法的类的实例
【发布时间】:2012-12-19 19:42:12
【问题描述】:

我正在使用面向对象的 coffeescript 构建一个 Node.js 应用程序。

我有一个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 方法返回的不同类型实例的行为,而不必在每个子类中重写它?

【问题讨论】:

    标签: javascript oop node.js inheritance coffeescript


    【解决方案1】:

    我不是 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"
    

    至少上面的测试似乎通过了。

    【讨论】:

    • 顺便说一句,“新 this”没有记录在案的功能,我在“类”部分找不到它。真的很有用,应该指定。
    【解决方案2】:
    @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% 动态的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      相关资源
      最近更新 更多