javascript - Weakmap 引用在继承中丢失

标签 javascript class ecmascript-6 private-members

我在使用 javascript 处理类的私有(private)成员时遇到了一个问题,我自己无法解决。

"use strict";
var privateData = new WeakMap();


class Fruit{
    constructor(name){
        privateData.set(this, {name: name});
    }

    name(){
        return privateData.get(this).name;
    }
}

class Orange extends Fruit{
    constructor(){
        super("Orange");
    privateData.set(this, {color: "blue"});
    }

    color(){
        return privateData.get(this).color;
    }
}

var fruit = new Fruit("Apple");
alert(fruit.name());
var orange = new Orange();
alert(orange.name());

第一个输出:Apple 第二个输出:未定义

我的猜测是,我正在覆盖“this”,因为如果我删除

return privateData.get(this).color;

有效。

最佳答案

是的,对象是唯一的,并且您将 this 实例用作键两次。第二次 set 调用将覆盖第一次调用的值,并且只保留具有 .color 属性的对象。

最简单的解决方案是为每个属性使用一个弱映射:

var privateNames = new WeakMap();
class Fruit {
    constructor(name) {
        privateNames.set(this, name);
    }
    get name() {
        return privateNames.get(this);
    }
}

var privateColors = new WeakMap();
class Orange extends Fruit {
    constructor() {
        super("Orange");
        privateColors.set(this, "blue");
    }
    get color() {
        return privateColors.get(this);
    }
}

或者,您必须改变存储的 data 对象:

var privateData = new WeakMap();
class Fruit {
    constructor(name) {
        privateData.set(this, {name: name});
    }
    get name() {
        return privateData.get(this).name;
    }
}

class Orange extends Fruit {
    constructor() {
        super("Orange");
        privateData.get(this).color = "blue";
    }
    get color() {
        return privateData.get(this).color;
    }
}

关于javascript - Weakmap 引用在继承中丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31417926/

相关文章:

javascript - 如何在React js中进行迭代并分成两组?

javascript - 当我仍将鼠标悬停在标签上时,会发生 onmouseout 事件

java - 如何获取Java中main中打印的类方法的返回值?

c++ - C++单例代码解释

javascript - 如何使用 Liberty 更改生成的 JSESSIONID 的长度?

javascript - jQuery 中的切换状态不正确

javascript - 如何让按钮进行数学运算,然后使用 JS 显示它?

javascript - 通过 JavaScript 对象的共享来测试深度相等性

javascript - 如何确定如何导入模块

javascript - 防止 babel 尝试将资源转换为 javascript 模块