无法将构造函数定义为绑定函数

时间:2012-02-17 15:12:10

标签: oop coffeescript

class A 
   constructor: ->
   method: ->

在上面的例子中,方法没有绑定到类,也没有绑定构造函数。

class B 
   constructor: ->
   method: =>

在这种情况下,方法绑定到类。它的行为与您期望的普通对象方法一样,并且可以访问所有B类字段。但构造函数不受约束?这看起来很奇怪。所以我尝试了以下内容。

class C 
   constructor: =>
   method: =>

这不编译。我希望语法在绑定到类的所有方法上都是相同的。

我想看看 - >运算符作为static运算符和=>运算符作为dynamic运算符。但似乎你不能。如果可以的话,使用 - >的方法无法用super调用operator。但是,实际上,你可以。为什么这对面向对象语言的语法有意义?这似乎与大多数面向对象语言的继承规则不一致。

2 个答案:

答案 0 :(得分:4)

尝试查看代码的编译方式。使用=>时,方法绑定在构造函数中。因此,对构造函数使用=>没有任何意义 - 什么时候绑定它?

我不确定您使用staticdynamic运算符的问题,但您绝对可以使用->运算符调用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设置为thiswindow没有这个问题,因为它绑定到了对象。

通常,您可以认为构造函数自动绑定到它正在构造的对象(因此,您无法将其与method2绑定)。但是,值得注意的是,这并不是正在发生的事情,因为如果构造函数返回一个对象,那将是构造的返回值,而不是构造函数中的=>

答案 1 :(得分:1)

我认为您对' =>'或胖箭的含义感到非常困惑。

首先,你的例子实际上并不是有效的coffeescript,不是吗?类声明后没有->。添加一个是编译器错误。

回到胖箭头,没有我想到的静态和动态术语的映射,这将适用于此处。相反,胖箭头是一个方便的语法糖,用于包含一个闭包函数,该闭包包含对您调用该函数的对象的引用。

C ++模拟可能会说胖箭头是一种自动创建仿函数的方法:它允许您将函数作为回调给第三方,该第三方可以在不知道您的对象的情况下调用它,但代码在哪里在内部调用将有权访问您的对象作为此指针。它没有任何其他用途,并且与功能是否可以重载或者是否可以访问超级无关。