2

这有效:

class Foo 
  class @_Bar 
    @narf = ''
    @point : ->
      @narf = 'what'

  class @_Baz extends @_Bar 
    @point : ->
      @narf = 'woo'
      super()

这不

class Foo 
  class @_Bar 
    @narf = ''
    @point = ->
      @narf = 'what'

  class @_Baz extends @_Bar 
    @point = ->
      @narf = 'woo'
      super()

运行Foo._Baz.point()会抛出错误。


请有人解释这里发生了什么。

4

3 回答 3

3

对我来说,这似乎是编译器中的一个错误。写作

class X
  @classMethod: ->

class X
  @classMethod = ->

应该是等效的,但是super在这两种方法中编译不同。首先,它编译正确:

X.__super__.constructor.classMethod.apply(this, arguments);

在第二种情况下,它就像classMethod一个实例方法一样编译:

X.__super__.classMethod.apply(this, arguments);
于 2013-11-08T17:49:35.410 回答
2

这有效:

class Foo 
  class @_Bar 
    @narf = ''
    point : ->
      @narf = 'what'

  class @_Baz extends @_Bar 
    @point = ->
      @narf = 'woo'
      super()

alert Foo._Baz.point()  # 'what'
alert new Foo._Bar().point() # 'what'

也就是说,compiled@point= super最终指向了 instance point:。它的 JS 是:_Baz.__super__.point.call(this),也就是_Bar.prototype.point.call(this). (extends定义:)child.__super__ = parent.prototype

从过去的 Coffeescript 更改中可以清楚地看出,这@point:是静态(类)方法的预期语法(并在编译器本身中以这种方式使用)。

于 2013-11-10T03:58:40.817 回答
1

现在在 github 上有几个修复。 https://github.com/jashkenas/coffee-script/issues/3232

目前,方法的节点树与@foo=方法的节点树不同@foo:。因此,使用创建的节点=永远不会传递给Class addParameters方法,也永远不会标记为static.

一种可能会被接受的解决方案确保两种形式产生相同的节点树。

我贡献的一个https://github.com/jashkenas/coffee-script/issues/3232#issuecomment-28316501 添加了一个方法到nodes.coffee class Class. 此方法是 的精简版addParameters,专门检查=节点树。

如果您需要在自己的 Coffee 编译器中进行修复,请修改您的src/coffee-script/nodes.coffee文件,对其进行编译,然后将结果node.js放在lib目录中(或使用cake build.

于 2013-11-12T19:52:49.283 回答