class A
constructor: ->
method: ->
在上面的例子中,方法没有绑定到类,也没有绑定构造函数。
class B
constructor: ->
method: =>
在这种情况下,方法绑定到类。它的行为与您期望的普通对象方法一样,并且可以访问所有B类字段。但构造函数不受约束?这看起来很奇怪。所以我尝试了以下内容。
class C
constructor: =>
method: =>
这不编译。我希望语法在绑定到类的所有方法上都是相同的。
我想看看 - >运算符作为static
运算符和=>运算符作为dynamic
运算符。但似乎你不能。如果可以的话,使用 - >的方法无法用super调用operator。但是,实际上,你可以。为什么这对面向对象语言的语法有意义?这似乎与大多数面向对象语言的继承规则不一致。
答案 0 :(得分:4)
尝试查看代码的编译方式。使用=>
时,方法绑定在构造函数中。因此,对构造函数使用=>
没有任何意义 - 什么时候绑定它?
我不确定您使用static
与dynamic
运算符的问题,但您绝对可以使用->
运算符调用super
运算符定义的方法。 ->
与=>
唯一影响的是,=>
确保this
是相关对象,无论其如何被调用。
评论摘要:
调用->
和=>
之间的区别,类似于静态与动态(或虚拟),并不能完全传达这些运算符的作用。它们用于从javascript的this
变量中获取不同的行为。例如,请查看以下代码:
class C
constructor: ->
method1: ->
console.log this
method2: =>
console.log this
c = new C()
c.method1() //prints c
f = c.method1;f() //prints window
c.method2() //prints c
f = c.method2;f() //prints c
区别在于我们调用每个方法的第二种方式:如果方法没有“绑定”到对象,则通过查看方法调用之前的内容来设置其this
(由{{1分隔) }})。在第一种情况下,这是.
,但在第二个c
中未调用对象,因此f
设置为this
。 window
没有这个问题,因为它绑定到了对象。
通常,您可以认为构造函数自动绑定到它正在构造的对象(因此,您无法将其与method2
绑定)。但是,值得注意的是,这并不是正在发生的事情,因为如果构造函数返回一个对象,那将是构造的返回值,而不是构造函数中的=>
。
答案 1 :(得分:1)
我认为您对' =>'或胖箭的含义感到非常困惑。
首先,你的例子实际上并不是有效的coffeescript,不是吗?类声明后没有->
。添加一个是编译器错误。
回到胖箭头,没有我想到的静态和动态术语的映射,这将适用于此处。相反,胖箭头是一个方便的语法糖,用于包含一个闭包函数,该闭包包含对您调用该函数的对象的引用。
C ++模拟可能会说胖箭头是一种自动创建仿函数的方法:它允许您将函数作为回调给第三方,该第三方可以在不知道您的对象的情况下调用它,但代码在哪里在内部调用将有权访问您的对象作为此指针。它没有任何其他用途,并且与功能是否可以重载或者是否可以访问超级无关。