【发布时间】:2018-03-31 19:13:16
【问题描述】:
我有一个简单的案例:一个 ES6 Map,我需要给它添加自定义的 get() 和 set()。
但是Map 是一个内置对象,所以我不确定这样做是否有任何警告。我试图搜索将Map 子类化是否正确,但结果不一致:尚不清楚规范是否允许,哪些浏览器/node.js 版本支持它,以及可能的副作用(和测试覆盖什么)。
据我了解,扩展Map 功能的主要方法有以下三种:
- 子类化它。我已经完成了,它似乎可以工作。
class CustomMap extends Map{
get(key){
return super.get(key);
}
set(key, value){
return super.set(key, value);
}
}
它的问题:Internet 上的很多文章都指出,扩展内置对象可能会遇到麻烦。大多数是 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 和set,还需要实现所有地图功能。此外,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 可以在现代浏览器中代理?
那么,问题是:在 2017 年,哪种扩展 Map 的方式是正确且稳健的方式?
【问题讨论】:
-
“网上很多文章说扩展内置对象会遇到麻烦” 也许你指的是扩展内置对象在 Babel 中没有得到很好的支持,因为 ES5 不支持它。
-
网上有人和昨天有人告诉我不要吃巧克力一样有帮助,这可能并不意味着巧克力不好吃跨度>
-
关于扩展内置对象的警告是关于向
Array.prototype、Object.prototype等添加其他内置对象的内容。
标签: javascript dictionary ecmascript-6