gpt4 book ai didi

javascript - Weakmap 引用在继承中丢失

转载 作者:行者123 更新时间:2023-11-30 12:20:02 25 4
gpt4 key购买 nike

我在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com