2010-11-16 9 views
8

Sé cómo añadir nuevos métodos a cada objeto - mediante el aumento de prototipo del objeto:¿Aumentando el prototipo de nodos de elementos DOM?

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

Pero, ¿es posible definir nuevos métodos para sólo los nodos elemento DOM? ¿Los objetos del nodo del elemento DOM tienen un prototipo? ¿O hay quizás un prototipo para nodos DOM en general?

O es que sólo existen objetos prototipo para los objetos incorporados en?

Respuesta

20

Sí, pero no en todos los navegadores. Internet Explorer 8 admite prototipos DOM (en cierta medida), al igual que Firefox, Chrome, Opera y Safari.

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

Muchos consideran que es una mala práctica ampliar los objetos DOM a través de su prototipo. Kangax tiene un gran artículo sobre el tema: http://perfectionkills.com/whats-wrong-with-extending-the-dom/. Sin embargo, los prototipos de DOM nos permiten implementar métodos basados ​​en estándares en entornos que aún no los admiten, al igual que los ajustes para los métodos de ECMAScript 5th Edition.

+0

Eso de hecho es un gran artículo. Lo verificaré e informaré. –

+4

el prototipo de ejemplo no oculta el elemento. Es alternar – jscripter

+0

¿por qué simplemente 'HTMLDivElement' por qué no agregar un prototipo a todos los elementos HTML? – vsync

0

Eso es exactamente lo que hace prototype.js, pero ahora se considera muy mala práctica. Es mucho mejor usar envolturas/manipuladores. Tenga en cuenta que el aumento de CUALQUIER objeto nativo, especialmente el objeto Object, es una mala práctica.

lectura:

Whats wrong with extending the DOM
Object.prototype is verboten

Adición:

Mientras se extiende objetos nativos en proyectos pequeños se puede considerar segura en realidad va a ser un muy mal habito. Solo es un poco menos grave que ensuciar el alcance global con funciones y variables. No solo ocurren las colisiones de nombres, sino también las colisiones de implementación. Esto se hará más apetecible cuanto más bibliotecas acumules.

Mantener su aplicación en sus propios objetos es la única manera de evitar cualquier colisión, nombre, aplicación o de otra manera.

Dicho todo esto, es su prerrogativa de hacer lo que quiera, que sin embargo no va a recomendar nada eso ampliamente aceptados como mala práctica pura. Me atengo a mi recomendación.

+0

@BGerrissen ¿Podría explicar qué hace exactamente prototype.js? No estoy familiarizado con esa biblioteca. Además, ¿podría explicar el uso de envolturas/manipuladores? ¿Qué quiere decir con eso? Además, dices "aumentar CUALQUIER objeto nativo, especialmente el objeto Objeto", pero no lo estoy aumentando, sino su objeto prototipo. –

+6

Recomendar contra el aumento de cualquier objeto nativo es temor monstruoso, IMO. * Las extensiones String.prototype * son muy útiles, por ejemplo, con el único inconveniente potencial de nombrar colisiones en el futuro. –

+0

a) Esta es una esencia de OOP, b) JS está completamente orientada a objetos.¿Desde cuando "ahora"? –

3

En algunos navegadores, los elementos DOM exponen un objeto prototipo, que también puede heredar de Object.prototype, pero esto no es universalmente cierto (por ejemplo, IE no). En general, los objetos host como los elementos DOM no están obligados a hacer esto; de hecho, los objetos host no están sujetos a muchas de las reglas que se aplican a los objetos JavaScript nativos, por lo que nunca debe confiar en los elementos DOM para admitir este tipo de cosas.

recomiendo kangax's excellent article on this subject.

+0

@Tim, estoy haciendo esta pregunta porque me gustaría hacer que sus funciones de selección sean más convenientes.Por ejemplo, si pudiera agregar un objeto 'selec' a los nodos del elemento HTML, entonces podría usar sus funciones de la siguiente manera:' input.selec.get(); input.selec.set (5,8); ' –

+1

@ Šime: Ah, claro. Si está utilizando jQuery, puede hacer algo similar al aumentar '$ .fn', como lo hacen los complementos. De lo contrario, no es posible en IE sin algún tipo de objeto contenedor de elementos (como jQuery's). –

+0

Afortunadamente para nosotros, IE finalmente se dirige en la dirección correcta: los objetos DOM de IE 9 heredan de 'Object.prototype'. @ Šime wrapping es casi seguro que es el camino a seguir, por el momento. –

Cuestiones relacionadas