0

我有以下代码声明了一个方法,该方法在函数结果分配给原型槽之前由中间函数建议。

class A
    somemethod: advise => @dosomething()

为什么在这种情况下胖箭头不绑定到实例?

4

1 回答 1

0

简单的答案

当在原型槽名称和函数定义之间放置中介时,您会破坏使 CS 在构造函数中发出绑定代码的句法模式

class A
    foo: (paramlist) =>
    bar: ()=>
    baz: =>

所有这些方法定义在生成的 Javascript 构造函数中发出此代码

function A() {
    this.foo = __bind(this.foo, this);
    this.bar = __bind(this.bar, this);
    this.baz = __bind(this.baz, this);
}

如果你在两者之间插入一些东西,你就会破坏Coffeescript编译器可以识别该模式并生成必要代码的句法模式。

class A
    helpWhereIsMyMethod: processTheFollowing => @doSomething()

在这种情况下,构造函数中不会生成绑定调用

更复杂的答案

当您定义一个原型槽(名称)并立即为其分配一个(匿名)函数时,您已经有效地创建了一个句柄,您以后可以通过该句柄访问该函数并“处理”它或调用它(大多数情况下)。

如果在将结果绑定到原型槽之前将函数通过管道传递到另一个函数(中介),那么您实际上会创建一个以后无法访问的匿名函数。

因此,Coffeescript 编译器不知道如何在构造函数中发出绑定代码,因为在对象创建期间不再提供对匿名函数的访问。

中间函数也可以生成自己的代码并发出这个新代码以绑定到原型槽。

于 2012-11-02T05:02:40.540 回答