调整ES2015 Map以支持所需的行为

时间:2016-03-19 21:06:51

标签: javascript typescript ecmascript-6

我正在玩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(...)方法?

1 个答案:

答案 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+)本身都支持类,它可以工作。