javascript - 調整 ES2015 Map 以支援期望的行為
我正在玩弄 ES2015 的 Map,我發現這是一個很棒的功能。然而,我現在有一個使用情境,無法完全確定是否能用 Map 解決。
考慮我的課程
class A {
constructor(public a:number) {}
public equals(obj: A): boolean {
return this.a === obj.a;
}
}
據我所知,ES2015 的 Map 將使用 === 相等運算符(有一些例外)。因此我想知道是否有可能覆寫相等運算,並強制它在 instanceof 時使用 A 物件的 equals(...) 方法?
最終,這就是我想要達到的目標:
var map = new Map();
map.set(new A(8), 7)
map.get(new A(8)) // return 7, not undefined
你認為我必須創建自己的 Map 類來實現這種行為,檢查兩個對象是否都是 A 的實例,然後調用 equals(...) 方法嗎?
答案#1
你可以根據需要創建子類並覆寫 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+)原生支援類別,且將能正常運作。
