在其他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"
答案 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