javascript - Weakmap reference lost in inheritance -


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