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

es6类方法中的“this”[重复]

乜昆
2023-03-14

出于某种原因,我在es6课上给“这个”取了个奇怪的值...

null

js prettyprint-override">'use strict';
class Clicker {
  constructor(element) {
    this.count = 0;
    this.elem = element;
    this.elem.addEventListener('click', this.click);
    
    // logs Clicker { count:0, elem: button#thing} as expected
    console.log(this);
  }

  click() {
    // logs <button id="thing">...</button> as unexpected...
    console.log(this);
    this.count++;
  }
}


var thing = document.getElementById('thing');
var instance = new Clicker(thing);
<button id="thing">Click me</button>

null

为什么clickers的click方法中的“this”指的是dom节点而不是...本身?

更重要的是,如果我不能使用“this”来做的话,我如何从它的click方法中引用clickers的count属性?

共有1个答案

阎阳
2023-03-14

为什么clickers的click方法中的“this”指的是dom节点而不是...本身?

因为.addeVentListener()的规范是将this指针设置为捕获事件的DOM元素。这就是它的工作原理。

当将方法作为要重写this值的回调传递时,可以使用.bind()强制使用this的所需值:

this.elem.addEventListener('click', this.click.bind(this));

说明:

Javascript中的所有函数调用都根据函数的调用方式设置this的新值。有关该基本规则集的进一步信息,请参阅本说明。

最重要的是,当你这样做时:

this.elem.addEventListener('click', this.click);

您只是获得this.click方法,并将该方法单独传递给AddEventListener()this的值将完全丢失。就好像你在这样做:

var m = this.click;     // m here is just a reference to Clicker.prototype.click
this.elem.addEventListener('click', m);

在此基础上,.addeVentListener()被专门构建为在调用回调时设置自己的this值(将this指向创建事件的元素)。

因此,您可以使用.bind(),如上图所示,在调用方法时强制this的正确值。

作为参考,您可能会发现在Javascript中为函数调用设置this的六种方式的描述非常有用。

其他选项

我发现.bind()是定义这一点的最清楚的方法,但您也可以使用本地匿名函数:

var self = this;
this.elem.addEventListener('click', function() {
    self.click();
});

或在ES6中,箭头函数:

this.elem.addEventListener('click', () => this.click());

箭头函数将自动为您保留this的值,以避免需要前面示例中使用的self引用。

 类似资料:
  • 问题内容: class App extends Component { constructor(props) { … } 在类中声明的两种函数 (onChange和onSubmit) 之间有什么区别?如果我将其声明为ES6类方法,但在 const url中 引用this.sate时出现错误,但是将其更改为arrow函数可以解决此问题。 我想知道两种情况下如何正确处理“ this” 另外,我该如何做

  • 在这个es6脚本中,click事件不起作用,因为方法是用( )作为 调用的。 如何将一个事件关联到一个方法而不松散作用域? 匿名用户 这是一个常见的JS问题,但其核心是 无异于 您正在将函数作为事件处理程序传递,但没有确保在调用时将设置为所需的值。在ES5中实现这一点的最简单的方法是 或在ES6中,使用箭头函数: 但是请注意,这两种解决方案都将破坏中的逻辑(已经稍微破坏了),因为 您不再有任何对附

  • 玩一些es6,遇到了一个问题,我不知道如何解决 在的内部,?目前我用bind解决了这个问题,但我想知道是否有一种更“合适”的ES6方法来实现这一点。

  • 问题内容: 考虑到这一节课;我将如何迭代其中包含的方法? 我尝试过的以下操作均未成功: 问题答案: 您可以在原型上使用Object.getOwnPropertyNames:

  • 这里的this指的是Toppings类的一个实例。 只要使用点号调用list方法,如myToppings.list(),则this.formatToppings(this.toppings)调用在类的实例上定义的formatToppings()方法。 这也将确保formatToppings内部,this指的是同一个实例。 但是,this也可以指其他东西。有两种基本情况你应该记住。 方法调用:

  • 我正在尝试创建一个简单的国际象棋程序,我遇到了一个小问题,当执行典当推广。我有一个抽象的类片和6个类(国王,皇后,鲁克,骑士,主教和卒)扩展它。所以当一个棋子到达棋盘的另一端时,我想让他变成皇后。 我想知道是否有更好的方法来做这件事。以某种方式从“内部”更改对象的类。