我有一个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()
时定义@i
从Test
运行Test::f1()
。
谢谢! :d
答案 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()
,因为Child
是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
。