与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());


第一输出:苹果
第二输出:未定义

我的猜测是,我要覆盖“ 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 - 弱映射引用在继承中丢失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31417926/

10-12 12:26
查看更多