如何正确扩展ES6 Map

2024-03-22

我有一个简单的案例:ES6Map,我需要添加自定义get() and set() to it.

But Map是一个内置对象,所以我不确定这样做是否有任何警告。我试图搜索子类化 a 是否正确Map,并得到不一致的结果:尚不清楚规范是否允许、哪些 browser/node.js 版本支持它,以及可能产生哪些副作用(以及测试要涵盖哪些内容)。

据我了解,主要有以下三种扩展方法Map功能:

  1. 将其子类化。我已经做到了,而且它seems就像它有效一样。
class CustomMap extends Map{
    get(key){
        return super.get(key);
    }
    set(key, value){
        return super.set(key, value);
    }
}

问题在于:互联网上的许多文章都指出,扩展内置对象可能会遇到麻烦。大多数是 2016 年初,现在是 2017 年底,在 Chrome 61 中进行测试。也许现在这是一种安全且受支持的方法?

  1. 制作一个包装对象
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.

  1. 使用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可以在现代浏览器中代理吗?

那么问题来了:用什么方法来扩展Map2017年是正确而稳健的方式吗?


尚不清楚规范是否允许

这是。从 ES6 开始,所有内置类型都可以使用class syntax

目前尚不清楚哪些 browser/node.js 版本支持它

他们需要支持 ES6 类并且Map原生地。使用转译器通常会破坏它。

1)对其进行子类化。我已经做到了,而且看起来确实有效。

是的,这是正确的做法。

互联网上的许多文章都指出,扩展内置对象可能会遇到麻烦。大多数是 2016 年初,现在是 2017 年底,在 Chrome 61 中进行测试。

不知道,主要参考http://perfectionkills.com/extending-native-builtins/ http://perfectionkills.com/extending-native-builtins/是从 2011 年开始的。这些文章通过“扩展内置函数”意味着不同的事情:用自定义对象修改它们的原型对象,例如Map.prototype.getWithDefault = function(…) { … };。他们不指class … extends ….

制作一个包装对象

这也应该没问题。我认为你不一定需要你的实例instanceof Map,如果你这样做,你必须遵循里氏替换原则 https://en.wikipedia.org/wiki/Liskov_substitution_principle。并非键值集合的所有“扩展”都适合这一点。

3)使用ES6 Proxy - 不建议对某些内置类型应用Proxy。

Indeed, 这不起作用 https://stackoverflow.com/q/43236329/1048572或者至少很麻烦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确扩展ES6 Map 的相关文章

随机推荐