我正在玩ES2015地图,我发现这是一个很棒的功能。但是,我现在有一个用例,我无法弄清楚是否可以使用Maps。
考虑我的班级
class A {
constructor(public a:number) {}
public equals(obj: A): boolean {
return this.a === obj.a;
}
}
据我所知,ES2015 Maps将使用===相等运算符(有一些例外)。因此,我想知道是否有可能覆盖相等性并强制它使用A
对象的equals(...)
方法,如果是instanceof?
最终,这就是我想要实现的目标:
var map = new Map();
map.set(new A(8), 7)
map.get(new A(8)) // return 7, not undefined
您是否认为我必须创建自己的Map类来实现此行为,以检查两个对象是否为A
的实例,然后调用equals(...)
方法?
答案 0 :(得分:2)
您可以根据需要创建子类并覆盖get
方法:
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)))
请注意,Babel不支持本机类扩展。但是大多数浏览器(Chrome 42 +,Firefox 45+)本身都支持类,它可以工作。