i encountered problem while working private members of classes in javascript, cannot solve myself.
"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()); first output: apple second output: undefined
my guess is, i'm overwriting 'this', because if delete
return privatedata.get(this).color; it works.
yes, objects unique, , using this instance key twice. second set call overwrite value first call, , leave object .color property.
the easiest solution use 1 weak map per attribute:
var privatenames = new weakmap(); class fruit { constructor(name) { privatenames.set(this, name); } name() { return privatenames.get(this); } } var privatecolors = new weakmap(); class orange extends fruit { constructor() { super("orange"); privatecolors.set(this, "blue"); } color() { return privatecolors.get(this); } } alternatively, have mutate stored data object:
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.get(this).color = "blue"; } color() { return privatedata.get(this).color; } }
Comments
Post a Comment