静态属性继承 CoffeeScript



让我们定义这个简单的代码:

class Foo
  @foo = 'blah'
  console.log(@foo)
class Bar extends Foo
  constructor: () ->
    console.log(@foo)
  bar: () ->
    console.log(@foo)
b = new Bar
b.bar()

结果是:

blah
undefined
undefined

如何访问继承类中的@foo

你真的想写

console.log(@constructor.foo)

Bar的构造函数中。(此处为工作示例。 @constructor指向类 (Bar ),它继承了 Foo 的静态属性。这些属性不在实例上,这是@从构造函数指向的内容。

(是的,奇怪的是它是@constructor而不是@class,但那是因为obj.constructor是JavaScript主义,而不是特殊的CoffeeScript语法。

进一步澄清:在类主体中,@指向类。在构造函数中,@指向实例。因此,明显的不一致。在我的书《CoffeeScript: Accelerated JavaScript Development》中关于类的章节中,我花了很多时间讨论这个问题。

fooFoo 构造函数的属性,而不是其原型:

class Bar extends Foo
  constructor: () ->
    console.log(Foo.foo)
  bar: () ->
    console.log(Foo.foo)

最新更新