29.09.2011

Какво не е наред с разширяване на DOM?

* Source text URL: http://perfectionkills.com/whats-wrong-with-extending-the-dom/


Недавно бил учуден, когато научих колкото мало е разпространена в Интернета темата на разширение DOM. Безпокои само това, че нижните страни на тази наглед полезна практика  струва се, са неизвестни, освен определени изолирани кръгове. Липсата на информация би могла да обясни хуюбаво, защо днес с са създани скриптове и библиотеки, които все още попаднат в тази капана. Бих искал да обясня, защо разрешение на DOM е, изцяло, лоша идеята, като показва няколко проблеми, свързани с ним. Ние също ще разглеждаме възможните алтернативи по този вредено осъществление.

Но, по-напред, какво е точното разширяване на DOM? И за какъв начин всичко това произлиза?
Как произлиза разширяване на DOM?
Разширяване на DOM  е прост процесс на добавяване на ползвателски методи/свойства към обекти на DOM.  Ползвателските свойства са онези, които не съществуват в определена реализация. И какви са обекти на DOM? Те са обекти на възел, реализирайки Елемент, Събитие, Документ или които да е друго от десятъци на другите интерфейси на DOM. По време на разширяване методи/свойства могат да бъдат добавени непосредственно към обекти или техните прототипи (но само в среди, където е надлежаща поддръжка на онези).

Обикновенно разширени обекти са, вероятно, елементи на DOM (те, които реализират  интерфейс на Елемента), популяризирани библиотеки Javascript, като Prototype и Mootools. Обекти-собития (те, които реализират интерфейс на Събитие) и документи Интерфейс на документа)) часто се разширяват също.
В среда, коята представлава по себе си прототип на обекти на Елемента, пример на разширяаане на DOMA  изглежда приблизително за такъв начин:
Element.prototype.hide = function() {      this.style.display = ‘none’;    };    …    var element = document.createElement(‘p’);      element.style.display; // ”    element.hide();    element.style.display; // ‘none’ 

Как Вие можете да видете, функция «hide» изпърво присвоена за скрито свойство element/prototype. След това тя предизвикана на елемента, и стил на елемента «display» установен на «None».
Причина, поради коята всичко това «работи», състои в това, че обекта, споменат в Element/prototype е фактически един от обекти в прототипен ред на елемента P.  Когато войство hide е разрешено за него, то се търси навсякъде по прототипен ред, докато не се намира на този обекта – Element.prototype.
Фактически ако ние бихме били длъжни да изследваме прототипен ред на елемента P  в някои от съвремените браузъри, това би приличало на онова:
// "^" denotes connection between objects in prototype chain      document.createElement(‘p’);      ^    HTMLParagraphElement.prototype      ^    HTMLElement.prototype      ^    Element.prototype      ^    Node.prototype      ^    Object.prototype      ^    null 

Отбележите, като най-близкия прародител в прототипен ред на елемента P  е обект, споменат HTMLaragraphElement.prototype.  Това е обект определен за типа на елемента. За елемента P  това е HTMLParagraphElement.prototype. За елемента DIV е HTMLDivElement.prototype за елемента A това е HTMLAnchorElement.prototype и така нататък.

ok ok