【问题标题】:JavaScript extend a class while using WeakMap for private variablesJavaScript 扩展一个类,同时将 WeakMap 用于私有变量
【发布时间】:2019-10-06 03:58:26
【问题描述】:

我通过使用WeakMap() 编写了一些具有私有变量的类。我通过在类文件的顶部放置一个WeakMap 来做到这一点。

light.js

let privateVars = new WeakMap();

class Light {
  constructor(state, brightness) {
    let info = {"state": state, "brightness": brightness, "createdAt": Date.now()};
    // Save info into privateVars
    privateVars.set(this, info);
  }

  switch() {
    let info = privateVars.get(this);
    info.state = !info.state;
    privateVars.set(this, info);
  }
}

这很好用,我可以添加一些 getter 和 setter,它们具有验证和类型检查功能。

现在我想将该类扩展到另一个类,但在子类文件和父类文件之间共享私有属性信息时遇到问题。

flashLight.js

let privateVars = new WeakMap();
let flashing;

import Light from './light.js';

class FlashingLight extends Light {

  constructor(state=false, brightness=100, flashMode=true) {
    super(state, brightness);
    let info = {"state": state, "brightness": brightness, flashMode: flashMode, "createdAt": Date.now()};
    privateVars.set(this, info);
    if(flashMode===true) {
      this.startFlashing();
    }
  }

  startFlashing() {
    flashing = setInterval(this.lightSwitch,5000);
  }

}

当从startFlashing 内部的setInterval 函数调用this.lightSwitch 时,它无法访问对象的状态。

Uncaught TypeError: Cannot read property 'state' of undefined
    at lightSwitch 

这是因为这些函数分布在两个文件中吗?无论如何,我可以使用私有变量和类扩展吗?

【问题讨论】:

  • 这是因为你有两个不同的变量名为privateVars,每个文件都使用自己的版本。
  • @some 我更新了我得到的错误。鉴于我有 2 个名为 privateVars 的变量并设置了这两个变量,我不应该至少取回这 2 个值中的 1 个吗?相反,它返回未定义。
  • 在经典继承模式中,子类无论如何都无法访问基类私有变量。您是否打算实现 protected 变量?
  • 顺便说一句,我在任何地方都没有看到 this.lightSwitch 的实现。
  • @PatrickRoberts 感谢您指出这一点。我可能应该只是将statebrightness 传递给super(),并且只担心我的子类中的flashMode。如果我需要在子类中使用这些变量,我可以使用 getter 和 setter 方法。

标签: javascript ecmascript-6 es6-modules es6-class weakmap


【解决方案1】:

您的一个问题是在传递函数的地方使用setInterval。当调用该函数时,this 不是您所期望的。您可以使用bind 强制它成为您想要的,例如setInterval(this.lightSwitch.bind(this),5000)

【讨论】:

    猜你喜欢
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2010-10-20
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多