-1

我有一个Child扩展类Test。我想从Testfrom调用一个函数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我运行时定义。constructornew Child()@iTestTest::f1()Child.run()

谢谢!:D

4

2 回答 2

0

当您创建Child. 问题在于您调用f1.

你不想说Test::f1()。你可以说@f1(),sinceChild是 的子类Test。它们在一个非常重要的方面是不同的: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

于 2013-02-23T23:05:04.193 回答
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 专家,所以我不确定::需要什么语法。)

于 2013-02-23T22:11:23.163 回答