在原型的对象上保留`this`

时间:2013-08-30 15:21:20

标签: object coffeescript prototype this

我正在尝试构建一个用于学习目的的小型JavaScript库。我在原型中有一个对象,里面有一些函数。我想从函数内部访问this(具有valueOf和东西的那个),但this现在只向我提供函数的父对象。

我的代码(咖啡):

HTMLElement.prototype.on =
  click: (action) -> @valueOf().addEventListener('click', action, false)
                     # I'd like this to work,
                     # but `this` here refers to the `on` object

这可能吗?我知道我有点重新发明轮子,但正如我所说,这是出于研究目的,所以这就是我的想法。

2 个答案:

答案 0 :(得分:1)

我对OP所指的“这个”并不是100%肯定,但我会尽力回答:

让我们首先将您的咖啡脚本代码编译为javascript:

HTMLElement.prototype.on =
  click: (action) =>> @valueOf().addEventListener('click', action, false)

HTMLElement.prototype.on = {
  click: function(action) {
    return this.valueOf().addEventListener('click', action, false);
  }
};
好的,好的。在javascript中,函数中this的值可以由许多因子确定,其中一个是MemberExpression。当您使用a.b()调用某个函数时,其中a是一个对象,函数this中的b将绑定到a。在你的情况下,你可能会调用这样的函数:

element.on.click(...);

问题是element.on本身就是一个对象。表达式将评估为

(element.on).click(...);

this函数中click的值将是对象prototype.on,而不是element

基本上,不要这样做。将this绑定到HTMLElement实例会很麻烦。将函数直接放在原型上。我能想到的唯一解决方案(可怕,羞辱我)是:

element.on.click.bind(element)(...)

答案 1 :(得分:0)

如果我正确理解您的问题,解决方案是=>操作者。

http://coffeescript.org/#fat-arrow