运行方法参考它来自子类的静态变量

时间:2013-02-23 22:01:21

标签: class coffeescript

我有一个Child课,它扩展了Test。我想从Test的{​​{1}}调用一个函数。

我试过了:

Child

当我致电class Test constructor: -> @i = 'hello world' f1: -> console.log @i f2: -> console.log 'hello' class Child extends Test run: -> Test::f1() hello = new Child() hello.run() 时,它会调用hello.run(),但结果为Test.f1()。它不是在运行undefined之前设置静态变量@i

如果我将Test.f1()切换为Test::f1(),它会给我正确的结果。

我需要知道在创建Test::f2()时如何让Test constructor运行,以便在new Child()时定义@iTest运行Test::f1()

谢谢! :d

2 个答案:

答案 0 :(得分:0)

这是一种方法:

class Test
  @i: 'hello world'

  @f1: -> console.log @i
  f2:  -> console.log 'hello'

class Child extends Test
  run: ->
    Test.f1()

hello = new Child()
hello.run()

注意,i变量是静态的,因此在构造函数中设置它是没有意义的。此外,f1方法现在也是静态的。

(我不是CoffeeScript的专家,所以我不确定需要::语法是什么。)

答案 1 :(得分:0)

当您创建Child的新实例时,正在运行构造函数。问题在于您调用f1的方式。

你不想说Test::f1()。您可以说@f1(),因为ChildTest的子类。它们之间的区别非常重要:Test::f1()未设置this,因此当该函数请求this.i时,它只找到undefined,因为this是设置为Window(或者像浏览器中的那样荒谬,不确定你是否在Node中运行它)。说@f1()与说Test::f1.call(this)相同。这是CoffeeScript的类系统允许你做的好事之一。

最后,一个迂腐的说明:你编写的代码中没有静态变量。正如您所写,i是一个实例变量。静态变量如下所示:

class Test
  @staticVar = 1234

或者像这样:

class Test
  # ...

Test.staticVar = 1234

实例变量如下所示:

class Test
  fn: -> 
    @instanceVar = 1234

或者像这样:

test = new Test()
test.instanceVar = 1234

或者甚至喜欢这样(对于所有实例之间共享的实例变量的默认值):

Test::instanceVar = 1234

以类似的方式:

  

当我致电hello.run()时,它会调用Test.f1(),但结果为undefined。它不是在运行@i之前设置静态变量Test.f1()

你永远不会打电话给Test.f1();你正在呼叫Test::f1(),这是非常不同的。在您编写的代码中, 没有Test.f1,只有Test.prototype.f1