J'ai un cas simple: un ES6 Map
, et j'ai besoin d'ajouter get()
et set()
personnalisé.Comment étendre correctement ES6 Carte
Mais Map
est un objet intégré, donc je ne suis pas sûr s'il y aurait des avertissements à le faire. J'ai essayé de chercher s'il est correct de sous-classer un Map
, et j'ai obtenu des résultats incohérents: on ne sait pas si cela est autorisé par spécification, quelles versions de browser/node.js le supportent, et quels effets secondaires sont possibles (et quoi couvrir avec des tests).
Si je comprends bien, il y a trois approches pour étendre les fonctionnalités Map
:
1) sous-classer. Ce que j'ai fait, et il semble comme si cela fonctionne.
class CustomMap extends Map{
get(key){
super.get(key);
}
set(key, value){
super.set(key, value);
}
}
Problème avec cela: de nombreux articles sur Internet affirment que vous pouvez rencontrer des problèmes avec l'extension d'objets intégrés. La plupart sont début 2016, et sont maintenant fin 2017, testant dans Chrome 61. Peut-être que maintenant c'est une façon sûre et supportée de le faire?
2) Faire un objet wrapper
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
}
La solution la moins élégante, comme je l'ai besoin de mettre en œuvre non seulement get
et set
, mais toutes de fonctionnalités de la carte. En outre, Wrapper
n'est pas une instance de Map
.
3) Utilisez ES6 Proxy
const ProxyMap = function(){
return new Proxy(new Map(), {
get(target, key){
return target.get(key)
}
set(target, key, value){
target.set(key, value);
}
}
}
Comme l'extension d'une classe, il est déconseillé d'appliquer Proxy
à certains types intégrés. Mais encore une fois, beaucoup de temps s'est écoulé depuis l'introduction des spécifications Proxy
; peut-être maintenant Map
pourrait par proxy dans les navigateurs modernes? Donc, la question est: quelle est la façon d'étendre un Map
est une manière correcte et robuste en 2017?
* "Beaucoup d'articles sur Internet affirment que vous pouvez rencontrer des problèmes avec l'extension d'objets intégrés" * Vous faites peut-être allusion au fait que l'extension des objets intégrés n'est pas bien supportée dans Babel car ES5 doesn ne le supporte pas. –
* quelqu'un sur internet * est aussi utile que * quelqu'un m'a dit hier de ne pas manger de chocolat *, cela ne veut pas dire que le chocolat n'est pas délicieux –
Les avertissements concernant * l'extension des objets intégrés * concernent l'ajout de choses à 'Array. prototype', 'Object.prototype' etc. pour d'autres objets intégrés. – pawel