我有一个简单的例子:一个ES6 Map
,我需要添加自定义get()
和set()
它。如何正确扩展ES6映射
但Map
是一个内置对象,所以我不确定是否会有这样的警告。我试图搜索子类Map
是否正确,并得到了不一致的结果:目前尚不清楚规范是否允许,浏览器/ node.js版本支持它,以及哪些副作用是可能的盖上测试)。
据我所知,有延长Map
功能三种主要的方法:
1)子类它。我已经做了,它似乎喜欢它的作品。
class CustomMap extends Map{
get(key){
super.get(key);
}
set(key, value){
super.set(key, value);
}
}
问题在于:互联网上的很多文章指出,您可能会遇到扩展内置对象的麻烦。大多数是2016年初,现在是2017年后期,在Chrome 61上进行测试。也许现在它是一种安全且支持的方式呢?
2)做一个包装对象
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
的实例。
3)使用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年的正确和强大的方式?
*“互联网上的很多文章指出,您可能会遇到扩展内置对象的麻烦”*您可能指的是在Babel中不支持扩展内置对象,因为ES5不支持不支持它。 –
*有人在互联网上*是有帮助*有人告诉我昨天不吃巧克力*,这可能并不意味着巧克力不好吃 –
关于*扩展内置对象*的警告是关于添加东西到'阵列。原型','Object.prototype'等等内置对象。 – pawel