我有一个简单的案例:ES6Map
,我需要添加自定义get()
and set()
to it.
But Map
是一个内置对象,所以我不确定这样做是否有任何警告。我试图搜索子类化 a 是否正确Map
,并得到不一致的结果:尚不清楚规范是否允许、哪些 browser/node.js 版本支持它,以及可能产生哪些副作用(以及测试要涵盖哪些内容)。
据我了解,主要有以下三种扩展方法Map
功能:
-
将其子类化。我已经做到了,而且它seems就像它有效一样。
class CustomMap extends Map{
get(key){
return super.get(key);
}
set(key, value){
return super.set(key, value);
}
}
问题在于:互联网上的许多文章都指出,扩展内置对象可能会遇到麻烦。大多数是 2016 年初,现在是 2017 年底,在 Chrome 61 中进行测试。也许现在这是一种安全且受支持的方法?
- 制作一个包装对象
const Wrapper = function(){
this._map = new Map();
this.get = (key) => {return this._map.get(key);}
this.set = (key, value) => {this._map.set(key, value);}
... everything else
}
最不优雅的解决方案,因为我需要实现的不仅仅是get
and set
, but all地图功能。还,Wrapper
不是一个实例Map
.
- 使用ES6代理
const ProxyMap = function(){
return new Proxy(new Map(), {
get(target, key){
return target.get(key)
}
set(target, key, value){
target.set(key, value);
}
}
}
与扩展类一样,不建议应用Proxy
一些内置类型。但同样,自推出以来已经过去了很长时间Proxy
规格;也许现在Map
可以在现代浏览器中代理吗?
那么问题来了:用什么方法来扩展Map
2017年是正确而稳健的方式吗?