JavaScript: вызов прототипа возвращает ошибку «не функция» - PullRequest
1 голос
/ 02 июля 2019

Я создал простую функцию ptotype, которую я хочу использовать для редактирования атрибутов данных элементов на моей веб-странице. Я тестирую его, как и все версии Chrome, начиная с 49.0.2623.112m и заканчивая самой новой. Дело в том ... Это нигде не работает ...

Я не могу заставить этот кусок кода работать в моем проекте. Кажется, он отлично работает на stackoverflow (ниже фрагмента), но он не работает ни в одном из моих проектов, которые я размещаю локально на своем компьютере. Даже на пустых страницах только с элементами body и a, без каких-либо дополнительных сценариев.

Каждый раз, когда я запускаю этот код, он возвращает ошибку ar ...is not a function.

Мой вопрос: Это вызвано некоторыми проблемами с устаревшим браузером, или это ошибка при написании? Я полностью потерян здесь. Я искал два дня и не нашел ответа ..

<html>
<head>
<script>
Element.prototype.data = function(name, value) {
 this.setAttribute(name, value);
}
</script>
</head>

<body>
  <a href="#">Text</a>
</body>

<script type="text/javascript">
window.setTimeout(function(){ document.querySelector('a').data('href','https://google.com');
},5000);
</script>

</html>

1 Ответ

0 голосов
/ 02 июля 2019

Как подробно описано в комментариях, прототипы обезьян-патчей считаются вредными .Используя атрибуты в качестве хранилища данных, вы можете столкнуться с ситуациями, когда ваш метод перезаписывает важные атрибуты 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...