Weakmap 引用在继承中丢失
Weakmap reference lost in inheritance
我在 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
第二个输出:undefined
我的猜测是,我正在覆盖 '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 中与 类 的私有成员一起工作时遇到问题,我自己无法解决。
"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 第二个输出:undefined
我的猜测是,我正在覆盖 '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;
}
}