2010-09-30 15 views
7

Sé que esto fue un tema polémico hace cinco años, pero me pregunto si las cosas han cambiado para el JavaScript de hoy. ¿Hay algún ejemplo del mundo real de una gran biblioteca moderna que sea incompatible con la extensión Object.prototype?¿Cuáles son los beneficios y los peligros de agregar métodos a Object.prototype en Javascript?

No estoy interesado en la hipotética "alguien puede escribir mal código for in iteración en una biblioteca que desea utilizar, quizás, en el futuro, y entonces se podría obtener un error raro"

+1

Hay una buena discusión sobre esto en [Object.prototype es erlaubt] (http: // www.thomasfrank.se/object_prototype_is_erlaubt.html) –

Respuesta

12

Son ¿Hay algún ejemplo del mundo real de una gran biblioteca moderna que sea incompatible con la extensión Object.prototype?

Sí, recuerdo problemas con jQuery, -que es una de las menos intrusivo bibliotecas- por ejemplo:

Otro caso que lo que recuerdo es que alguien agregó una función load al objeto Object.prototype, y causó problemas con el evento $().load:

// DON'T DO THIS ! :) 
Object.prototype.load = function() {}; 

​$(window).load(function() { 
    alert('load event'); // never fired 
});​ 

Ejemplo here.

Nunca se recomienda aumentar el objeto Object.prototype de esa manera, porque esas propiedades serán heredadas por una gran cantidad de objetos, incluso por algunos objetos host, y como usted sabe, la principal preocupación es que se enumeren por la declaración for-in.

En ECMAScript 5, ahora una forma más segura existe, porque ahora podemos declarar propiedades no enumerables, por ejemplo:

Object.defineProperty(Object.prototype, 'foo', { value: 'bar' }); 

En el descriptor de propiedad - { value: 'bar' } - podemos especificar atributos de propiedad, en el caso de valor Propiedades como en el ejemplo anterior, podemos especificar el atributo writable y el configurable atributo común (determina si una propiedad puede ser re-configurado -attribute cambios-o eliminado.

y tenemos también el enumerable atributo, que determina si la propiedad se enumerará en la declaración for-in.

Si no se especifica los atributos, que son false por defecto, el descriptor será parecida:

{ 
    value: 'bar', 
    writable: false, 
    configurable: false, 
    enumerable: false 
} 
+0

Gracias por la información acerca de que jQuery no funciona correctamente en todos los casos cuando Object.prototype está extendido. He leído que están planeando que interactúe muy bien en algún momento en el futuro. Supongo que, por ahora, todavía es demasiado pronto para extender Object.prototype sin una consideración muy cuidadosa. –

Cuestiones relacionadas