当前位置: 首页 > 知识库问答 >
问题:

ES6类和带有事件处理程序的“this”[重复]

龙宣
2023-03-14

玩一些es6,遇到了一个问题,我不知道如何解决

class Foo {
 constructor ( ) {
   window.addEventListener('scroll', this.watch);
 }

 watch ( ) {
   console.log(this);
 }
}

watch的内部,这是窗口对象,正如预期的那样。但是,我如何引用Foo?目前我用bindthis.watch.bind(this)解决了这个问题,但我想知道是否有一种更“合适”的ES6方法来实现这一点。

共有3个答案

钮长恨
2023-03-14

在我看来,处理这个问题的纯ES6方法是使用新的代理对象。实现将如下所示:

class Foo {
    constructor() {
        let proxy = new Proxy(this, this.watch);

        window.addEventListener('scroll', proxy);
    }

    watch(e) {
        console.log(this, e.target);
    }
}

我本来会包含一个Babel REPL示例,但是,这里有一个免责声明:Babel REPL不支持Proxy对象。angax的兼容性表显示了对各种Javascript引擎的支持。

水睿
2023-03-14

class关键字只是已知javascript原型继承链的一个语法糖。这种归因机制的工作方式是相同的。只要把这个类看作是一个很好的旧函数,它与这个函数一起工作,因此它可以归因于使用new关键字的类。

E6附带了许多新的关键字,使面向对象的javascript更加熟悉。我对此很高兴,但我们都必须记住,基本部分仍然是一样的,只是现在有一些新来者的阴影: D

ps:鉴于你知道这个代码在Javascript中是如何定义的,你可以在没有别名的情况下使用它,比如自代码或类似的东西,尽管这是一种常见的做法。

令狐辉
2023-03-14

您可以使用箭头功能。

arrow函数表达式(也称为fat arrow函数)与函数表达式相比具有更短的语法,并在词汇上绑定此值。

window.addEventListener('scroll', () => this.watch());
 类似资料:
  • 我想制作一个,传递事件和一些参数。问题是函数没有得到元素。下面是一个例子: 必须在匿名函数之外定义。如何获取传递的元素以在匿名函数中使用?有办法做到这一点吗? 那么呢?我似乎根本无法通过传递事件,是吗? 使现代化 我似乎用“这个”解决了这个问题 其中包含我可以在函数中访问的。 addEventListener 但是我想知道:

  • 我正在用ES6编写一个简单的组件(使用BabelJS),函数不工作。 典型的错误包括 无法读取未定义的属性“set state” 或 This.SetState不是函数 你知道为什么吗?代码如下:

  • 我试图创建一个反应组件,这是一个文本输入。当有人按下回车键时,必须调用mymethod()。但是在handleKeyPress,我不能访问类范围。我怎样才能解决这个问题?

  • 出于某种原因,我在es6课上给“这个”取了个奇怪的值... null null 为什么clickers的click方法中的“this”指的是dom节点而不是...本身? 更重要的是,如果我不能使用“this”来做的话,我如何从它的click方法中引用clickers的count属性?

  • 我试图从子文件夹加载fxml,但失败了。我有做替换场景内容的行: 谢谢

  • 本文向大家介绍学习JavaScript事件流和事件处理程序,包括了学习JavaScript事件流和事件处理程序的使用技巧和注意事项,需要的朋友参考一下 本文全篇介绍了JavaScript事件流和事件处理程序,分享给大家供大家参考,具体内容如下 一、事件流 事件流描述的是从页面中接收事件的顺序。IE的事件流是事件冒泡流,而Netscape Communicator的事件流是事件捕获流。 二、事件冒泡