Как подробно описано в комментариях, прототипы обезьян-патчей считаются вредными .Используя атрибуты в качестве хранилища данных, вы можете столкнуться с ситуациями, когда ваш метод перезаписывает важные атрибуты HTML, и ваши данные должны быть только типа string
.
Используя WeakMap
, вы можете сделать автономная функция, не имеющая ни одного из этих недостатков, где время жизни ваших данных все еще связано с временем жизни элемента, к которому они «подключены».
const data = (() => {
const map = new WeakMap();
return (element, key, value) => {
if (value == null) {
const innerMap = map.get(element);
if (innerMap) {
return innerMap.get(key);
}
}
const innerMap = map.get(element) || new Map();
map.set(element, innerMap);
innerMap.set(key, value);
};
})();
const el1 = document.querySelector("#el1");
const el2 = document.querySelector("#el2");
data(el1, "hello", "world");
data(el2, "foo", {
complex: "object"
});
console.log(data(el1, "hello")); // "world"
console.log(data(el2, "hello")); // undefined
console.log(data(el2, "foo")); // {complex: "object"}
<div id="el1">some element</div>
<div id="el2">some other element</div>