Coffeescript继承:静态变量/方法

时间:2015-03-13 19:41:35

标签: inheritance express coffeescript

在其他OOP语言中,以下是一种常见的抽象形式

class AbstractClass
  myVar: null

  @doSomething: ->
    console.log myVar

class Child extends AbstractClass
  myVar: 'I am a child'

调用Child.doSomething()应打印"我是小孩"。 我也应该能够将Child.doSomething作为回调传递并让它打印出来。我已尝试使用with或w / o @的所有组合,使用分号和等号来定义myVar,我无法弄明白。在CoffeeScript中执行此操作的正确方法是什么?

修改

我认为我过度简化了我的示例,因为我无法使其工作(进一步编辑:现在使用此解决方案)。这是真正的代码(建议的解决方案):

class AbstractController
  @Model: null

  @index: (req, res) ->
    console.log @
    console.log @Model
    @Model.all?(req.params)

class OrganizationController extends AbstractController
  @Model: require "../../classes/community/Organization"

在我的路由文件中

(express, controller) ->
  router = express.Router({mergeParams: true})
  throw new Error("Model not defined") unless controller.Model?
  console.log controller
  router
  .get "/:#{single}", _.bind(controller.show, controller)
  .get "/", _.bind(controller.index, controller)
  .post "/", _.bind(controller.post, controller)

将OrganizationController传递给这个函数正确地记录了OrganizationController对象,所以我知道它到达那里:

{ [Function: OrganizationController]
  Model: { [Function: Organization] ...},
  index: [Function],
  __super__: {} }

但是当我点击那条路线时,两个console.log调用打印出来

{ [Function: AbstractController]
  Model: null,
  index: [Function] }
null

我收到一个错误:"无法阅读财产'所有' of null"

1 个答案:

答案 0 :(得分:4)

你错过了一些@。以下打印I am a child

class AbstractClass
  @myVar: null

  @doSomething: ->
    console.log @myVar

class Child extends AbstractClass
  @myVar: 'I am a child'

Child.doSomething()

但是如果你想将它作为回调函数传递,你需要将它绑定到Child

callf = (f) ->
  f()

callf Child.doSomething                # prints undefined
callf Child.doSomething.bind(Child)    # prints I am a child