javascript - Justera ES2015 Map för att stödja önskat beteende
Jag leker med ES2015 Maps och jag upptäcker att det är en fantastisk funktion. Men nu har jag ett användningsfall som jag inte riktigt kan lista ut om det kan fungera med Maps eller inte.
Överväg min klass
class A {
constructor(public a:number) {}
public equals(obj: A): boolean {
return this.a === obj.a;
}
}
Så vitt jag förstår kommer ES2015 Maps att använda === likhetsoperatorn (med vissa undantag). Därför undrar jag om det är möjligt att på något sätt skriva över likheten och tvinga den att använda A-objektets equals(...)-metod om det är en instans av?
I slutändan är detta vad jag skulle vilja uppnå:
var map = new Map();
map.set(new A(8), 7)
map.get(new A(8)) // return 7, not undefined
Tror du att jag måste skapa min egen Map-klass för att implementera detta beteende som kontrollerar om båda objekten är instanser av A och sedan anropar equals(...)-metoden?
Svar #1
Du kan skapa en underklass och skriva över get-metoden efter behov:
class MapByEquals extends Map {
get(key) {
for(var k of this.keys()) {
if(key.equals(k)) {
return super.get(k);
}
}
return super.get(key);
}
}
"use strict";
class A {
constructor(a) {
this.a = a;
}
equals(b) {
return this.a === b.a;
}
}
class MapByEquals extends Map {
get(key) {
for(var k of this.keys()) {
if(key.equals(k)) {
return super.get(k);
}
}
return super.get(key);
}
}
var map = new MapByEquals();
map.set(new A(8), 7)
console.log(map.get(new A(8)))Var medveten om att Babel inte stöder utvidgning av inbyggda klasser. Men de flesta webbläsare (Chrome 42+, Firefox 45+) stöder klasser inbyggt och det kommer att fungera.
