【问题标题】:Coffeescript static inheritance of child classesCoffeescript子类的静态继承
【发布时间】:2013-11-13 03:52:49
【问题描述】:

这行得通:

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() 会抛出错误。


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

【问题讨论】:

标签: coffeescript


【解决方案1】:

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

class X
  @classMethod: ->

class X
  @classMethod = ->

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

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

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

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

【讨论】:

  • 真的,你认为这是一个错误?我认为这是故意的,我根本不理解其意图。
【解决方案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'

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

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

【讨论】:

  • 这毫无意义。 point : -> 附加为Foo.prototype.point,因此静态方法无法访问它。
  • 试试看。我指出的是 Coffeescript 的作用,而不是我认为它应该做的。
  • 其实point : ->附加为Foo._Bar.prototype.point
  • 你是对的 Foo._Bar.prototype.point 是它附加的地方,但你的回答“也就是说,@point= 超指向点:”仍然是错误的,因为原型不是静态的,它的实例。
  • 您的原始代码会引发错误,因为 Foo._Bar.prototype.point 未定义。我的工作是因为定义了“实例”方法。 staticinstance 之间的交叉不是您想要的,但实际上是 Javascript 代码所做的。
【解决方案3】:

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

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

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

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

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

【讨论】:

猜你喜欢
  • 2015-05-16
  • 1970-01-01
  • 2011-06-04
  • 2013-07-12
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多