Дополнение прототипа узлов элемента DOM? - PullRequest
10 голосов
/ 16 ноября 2010

Я знаю, как добавлять новые методы к каждому объекту - путем увеличения прототипа объекта:

Object.prototype.foo = function() {  }; 

Но возможно ли определить новые методы только для узлов элементов DOM?Есть ли у объектов DOM-элементов прототип?Или, может быть, есть прототип для узлов DOM в целом?

Или объекты-прототипы существуют только для встроенных объектов?

Ответы [ 3 ]

25 голосов
/ 16 ноября 2010

Да, но не во всех браузерах.Internet Explorer 8 поддерживает прототипы DOM (в определенной степени), как и Firefox, Chrome, Opera и Safari.

HTMLElement.prototype.toggle = function () { 
    this.style.display = this.style.display == 'none' ? '' : 'none';
}

Многие считают плохой практикой расширять объекты DOM посредством своего прототипа.У Kangax есть отличная статья на эту тему: http://perfectionkills.com/whats-wrong-with-extending-the-dom/. Однако прототипы DOM позволяют нам внедрять основанные на стандартах методы в средах, которые их еще не поддерживают, подобно прокладкам для методов ECMAScript 5-го издания.

3 голосов
/ 16 ноября 2010

В некоторых браузерах элементы DOM предоставляют объект-прототип, который также может наследоваться от Object.prototype, но это не всегда верно (например, IE этого не делает). Как правило, хост-объекты, такие как элементы DOM, не обязаны это делать; на самом деле, хост-объекты не связаны многими правилами, которые применяются к нативным объектам JavaScript, поэтому вам никогда не следует полагаться на элементы DOM для поддержки такого рода вещей.

Я рекомендую превосходную статью kangax на эту тему .

0 голосов
/ 16 ноября 2010

Это именно то, что делает prototype.js , но сейчас это считается крайне плохой практикой. Намного лучше использовать упаковщики / обработчики. Обратите внимание, что расширение ЛЮБЫХ нативных объектов, особенно объекта Object, является плохой практикой.

следующим образом:

Что не так с расширением DOM
Object.prototype является верботеном

Добавление:

Хотя расширение собственных объектов в небольших проектах может считаться безопасным , оно на самом деле станет крайне вредным привычкой. Это лишь незначительно хуже, чем засорение глобальной области видимости функциями и переменными. Происходят не только конфликты имен, но и конфликты реализации. Это станет более понятным, чем больше библиотек вы будете смешивать.

Хранение вашей реализации на ваших собственных объектах - это единственный способ избежать ЛЮБЫХ коллизий, имен, реализаций или других причин.

Все это говорит, что вы должны делать то, что вам нравится, однако я не буду рекомендовать ничего, что широко принимается как явная плохая практика. Я придерживаюсь своей рекомендации.

...