我有一個簡單的例子:一個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