我想创建一个类,它的方法可以被子类覆盖,但也可以用作回调。看来我只能在一种或另一种情况下获得所需的行为。这是一个例子:
class Parent
constructor: () ->
@foo = "foo"
fooNotAlwaysDefined: () ->
console.log("In parent.fooNotAlwaysDefined, @foo:#{@foo}")
childNotCalled: () =>
console.log("In parent.childNotCalled, @foo:#{@foo}")
class Child extends Parent
fooNotAlwaysDefined: () ->
console.log("In child.fooNotAlwaysDefined, @foo:#{@foo}")
childNotCalled: () ->
console.log("In child.childNotCalled, @foo:#{@foo}")
c = new Child()
c.fooNotAlwaysDefined()
c.childNotCalled()
process.nextTick(c.fooNotAlwaysDefined)
process.nextTick(c.childNotCalled)
我想要的是调用子函数并且 @foo 在两种用途中都在范围内(c。和作为回调)。这是我得到的输出:
在 child.fooNotAlwaysDefined 中,@foo:foo
在 parent.childNotCalled 中,@foo:foo
在 child.fooNotAlwaysDefined 中,@foo:undefined
在 parent.childNotCalled 中,@foo:foo
我发现的最好的解决方法是我可以将 fooNotAlwaysDefined 包装在一个提供给 process.nextTick 的匿名函数中,但这并不理想。
process.nextTick(() -> c.fooNotAlwaysDefined())
在 child.fooNotAlwaysDefined 中,@foo:foo
有没有办法构造类,以便我得到我想要的行为?
编辑:回答:下面非常有用的评论的摘要是 childNotCalled 看到的行为是一个错误。我会注意到我在 1.6.1 中看到了这种行为,所以虽然它可能已经得到改进,但它并没有解决这个问题。
第二次编辑:问题似乎已在 1.6.2 中完全解决。