2009-04-23 17 views
22

w JavaScripcie, można wydłużyć istniejących klas przy użyciu jego prototyp obiektu:W JavaScript, możesz rozszerzyć DOM?

String.prototype.getFirstLetter = function() { 
    return this[0]; 
}; 

Czy to możliwe, aby skorzystać z tej metody, aby przedłużyć elementów DOM?

+6

Możesz. Ale prawdopodobnie nie powinno :) http://perfectionkills.com/whats-wrong-with-extending-the-dom/ – kangax

+1

Rzeczywiście, zmieniły się w ciągu ostatnich trzech lat: https://github.com/nbubna/mind -hacking/blob/gh-pages/extending-the-dom.md –

Odpowiedz

20

można rozszerzyć DOM za pomocą prototypu elementu. Jednak nie działa to w IE7 i wcześniejszych wersjach. Będziesz musiał rozszerzyć konkretny element, po jednym na raz. Robi to biblioteka Prototype. Polecam przejrzeć source, aby zobaczyć dokładnie, jak to się robi.

+0

Należy pamiętać, że powinno to być wymagane tylko w IE6 i IE7, ponieważ IE8 obsługuje to. Zobacz http://msdn.microsoft.com/en-us/library/dd282900(VS.85).aspx. –

+0

ah - naturalnie testowałem tylko na FFx dzięki za wskazówkę. – nickf

+0

Tak, IE8 zrobiło wielkie postępy z manipulacją DOM, ale pełne poparcie tego nie jest już na szczycie mojej listy priorytetów teraz – geowa4

18

Znalazłem odpowiedź tak, jak pisałem pytanie, ale myślałem, że mimo to opublikuję informacje.

Obiekt, który należy rozszerzyć, to Element.prototype.

Element.prototype.getMyId = function() { 
    return this.id; 
}; 
1

Tak, można, ale zdecydowanie nie należy.

Jeśli zastąpisz coś, czego inna biblioteka spodziewa się być oryginalną lub inna biblioteka nadpisuje coś, czego oczekiwałeś .. chaos!

Najlepiej zachować kod w swoim własnym obszarze nazw/zasięgu.

7

Nie powinieneś bezpośrednio rozszerzać czegokolwiek (przez "cokolwiek" mam na myśli rodzime obiekty DOM) - to tylko doprowadzi do złych rzeczy. Dodatkowo ponowne rozszerzenie każdego nowego elementu (coś, co musiałbyś zrobić, aby obsługiwać IE), dodaje dodatkowe obciążenie.

Dlaczego nie przyjąć podejście jQuery i utworzyć otoki/konstruktora i rozszerzenia, które zamiast:

var myDOM = (function(){ 
    var myDOM = function(elems){ 
      return new MyDOMConstruct(elems); 
     }, 
     MyDOMConstruct = function(elems) { 
      this.collection = elems[1] ? Array.prototype.slice.call(elems) : [elems]; 
      return this; 
     }; 
    myDOM.fn = MyDOMConstruct.prototype = { 
     forEach : function(fn) { 
      var elems = this.collection; 
      for (var i = 0, l = elems.length; i < l; i++) { 
       fn(elems[i], i); 
      } 
      return this; 
     }, 
     addStyles : function(styles) { 
      var elems = this.collection; 
      for (var i = 0, l = elems.length; i < l; i++) { 
       for (var prop in styles) { 
        elems[i].style[prop] = styles[prop]; 
       } 
      } 
      return this; 
     } 
    }; 
    return myDOM; 
})(); 

Następnie można dodać swoje własne metody poprzez myDOM.fn ... I można go używać tak:

myDOM(document.getElementsByTagName('*')).forEach(function(elem){ 
    myDOM(elem).addStyles({ 
     color: 'red', 
     backgroundColor : 'blue' 
    }); 
}); 
+11

"Nie powinieneś bezpośrednio rozszerzać czegokolwiek - to tylko doprowadzi do złych rzeczy." Doprowadzi to do dobrych rzeczy, jeśli masz dobry powód, aby to zrobić i poprawnie napisać swój kod. Oprócz problemów z interoperacyjnością, nie ma powodu, aby nie rozszerzać Element.prototype; w przypadku innych domyślnych obiektów można uzyskać dużo dobrego (patrz dodawanie metod formatowania do Date.prototype lub przechodzenie do RegExp.prototype). Głupio jest zrezygnować z doskonale przydatnych praktyk OO, gdy są one dostępne i użyteczne. – eyelidlessness

+1

Nie mówimy tu o języku JavaScript i wzorcach projektowych ani o czymś podobnym. Chodzi o DOM - rozszerzanie rodzimych obiektów DOM nie jest dobrym pomysłem; nie wspominając o tym, że nie działa poprawnie we wszystkich przeglądarkach ... – James

+4

Oprócz interoperacyjności, dlaczego nie jest to dobry pomysł? – eyelidlessness

Powiązane problemy