【问题标题】:ES6 class: set return of function as a prototype methodES6 类:将函数的返回设置为原型方法
【发布时间】:2017-02-15 20:58:06
【问题描述】:

假设我需要一个用于窗口滚动事件的事件侦听器,并且我想将此侦听器作为方法存储在 ES6 类的原型上。这很容易。但我还需要一个去抖动函数来减少处理程序的执行次数(例如 _.debounce() 来自 lodash)。因此,我需要引用 _.debounce() 返回的方法作为侦听器,这样我就可以在需要时绑定和取消绑定它。使用 ES6 类执行此操作的最佳方法是什么? 重点是:我们可以将表达式的结果设置为 ES6 语法的原型方法吗?

class MyClass {

   constructor () {
      this.prop1 = 0;
      window.addEventListener('scroll', this.myListener.bind(this));
   }

   // Is it possible?
   myListener = _.debounce(() => {
      this.prop1 = 1;
   }, 200);   

}

【问题讨论】:

  • 如果你在类定义中去抖myListener,去抖计数将在所有实例之间共享(因此只有一个实例会看到该事件)。您必须在构造函数中添加去抖动以绑定到实例。

标签: javascript ecmascript-6


【解决方案1】:

您需要将绑定和去抖动的函数存储为实例的属性:

class MyClass {
    constructor () {
        this.prop1 = 0;
        this.boundListener = _.debounce(this.myListener.bind(this), 200);
        window.addEventListener('scroll', this.boundListener);
    }
    myListener() {
        this.prop1 = 1;
    }
    something() { // called later
        window.removeEventListener('scroll', this.boundListener);
    }
}

您必须为每个实例绑定和去抖动方法,否则它将不知道this.prop1 指的是哪个对象,并且去抖动会干扰其他实例。您不能在原型上执行此操作。但是,您可以完全省略原型:

class MyClass {
    constructor () {
        this.prop1 = 0;
        this.myListener = _.debounce(() => {
            this.prop1 = 1;
        }, 200);   
        window.addEventListener('scroll', this.myListener);
    }
    something() { // called later
        window.removeEventListener('scroll', this.myListener);
    }
}

【讨论】:

  • 谢谢,Bergi。我正是这样做的。但是,我想知道我们是否可以使用 ES6 语法将表达式的结果设置为原型方法...
  • @MatheusDal'Pizzol:是的:MyClass.prototype.myListener = <anExpression>;.
  • 嘿,菲利克斯!也谢谢你!但这是标准的 ES5 语法。正如我所说:我想知道是否可以使用 ES6 语法来实现这一点......
  • @MatheusDal'Pizzol 所有 ES5 语法也是 ES6 语法……不,不可能在 class 中执行此操作。正如我解释的那样,无论如何你都不想要这个。
  • 是的,@Bergi。我知道这一点。我只是想知道这种可能性。现在我知道它做不到,所以如果有一天我最终想到这样做,我不会浪费我的时间。感谢所有的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2013-11-08
  • 2020-04-05
  • 2020-08-31
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多