Вы можете напрямую расширить прототип нативных Объектов.Не все считают, что хорошая практика
Map.prototype.reportSize = function () {
return `This map contains ${this.size} ${this.size === 1 ? "entry" : "entries"}`;
};
var x = new Map();
console.log(x.reportSize());
x.set(3, "three");
console.log(x.reportSize());
В качестве альтернативы вы можете создать пользовательскую функцию, используя расширения внутри нее.Таким образом, вам не нужно расширять prototype
из Map
const MapWithExtensions = map => {
return {
map: map,
reportSize: function () {
return `This map contains ${this.map.size} ${
this.map.size === 1 ? "entry" : "entries"}`;
}
};
};
const myMap = MapWithExtensions(new Map);
console.log(myMap.reportSize());
myMap.map.set(9, "nine");
console.log(myMap.reportSize());
console.log(myMap.map.get(9));
Наконец, это может быть способ создания расширенного Map
без расширения прототипа Map
(фактически он сопоставляет ключи Map.prototype с методами внутрирасширенный Map
).
const xMap = MapFactory({
mySize: function() {return `Hi. My size is currently ${this.size}`}
});
const myMap = xMap.Create();
console.log(myMap.mySize());
console.log("setting [5, \"five\"]")
myMap.set(5, "five");
console.log(myMap.mySize());
console.log(myMap.entries().next().value);
function MapFactory(extensions = {}) {
const proto = new Map;
const mappings = Object.getOwnPropertyNames(Map.prototype)
.reduce( (reduced, key) => {
if (proto[key].constructor !== Function) {
reduced.localProps.push(key);
} else {
reduced.proto[key] = function (...args) { return this.map[key](...args); };
}
return reduced;
},
{ localProps: [], proto: {} }
);
const XMap = function (map) {
this.map = map;
mappings.localProps.forEach( prop =>
Object.defineProperty(this, prop, { get() {return this.map[prop]; }})
);
};
XMap.prototype = {...mappings.proto, ...extensions};
return { Create: (map = new Map) => new XMap(map) };
}