【问题标题】:Weakmap reference lost in inheritanceWeakmap 引用在继承中丢失
【发布时间】:2015-07-14 21:43:20
【问题描述】:

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

"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;

它有效。

【问题讨论】:

  • 您将值更改为{color: 'blue'},因此稍后访问name 将返回undefined。 WeakMap 不会神奇地合并这些值。
  • 为什么要使用“私人会员”呢?你几乎不需要它们。

标签: javascript class ecmascript-6 private-members


【解决方案1】:

是的,对象是唯一的,您将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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    相关资源
    最近更新 更多