網站搜尋

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+)原生支援類別,且將能正常運作。