Estoy leyendo es5 en estos días y encuentro que el atributo [[configurable]] en algunas propiedades integradas del objeto global está establecido en verdadero, lo que significa que podemos eliminar estas propiedades.
Por ejemplo:
el método de combinación del objeto Array.prototype tiene atributos
{[[Writable]]:true, [[Enumerable]]: false, [[Configurable]]: true}
Por lo tanto, podemos eliminar fácilmente el método de combinación para Array como:
delete Array.prototype.join;
alert([1,2,3].join);
La alerta se mostrará undefined
en mi cromo 17, firefox 9, es decir 10, incluso ie6;
En Chrome 15 y safari 5.1.1, el atributo [[configurable]] se establece en verdadero y el resultado de eliminación también es cierto, pero el resultado final aún lo es function(){[native code]}
. Parece que esto es un error y el cromo lo soluciona.
No lo he notado antes. En mi opinión, eliminar las funciones integradas en el código del usuario es peligroso y generará tantos errores al trabajar con otros. Entonces, ¿por qué ECMAScript toma esta decisión?
fuente
Respuestas:
Tendería a estar de acuerdo con usted, pero por otro lado, acabo de encontrar una situación en la que lo necesitaba
delete JSON.stringify
en ciertas circunstancias debido a un error en Firefox 3.5 . Ciertamente me alegré de la capacidad de parchear monos incorporados allí.fuente
JSON.stringify
e inyecta si es necesario. Disculpas, no expliqué eso en mi respuesta.Configurable no se trata de eliminación.
Se trata de la capacidad de reemplazar un valor de solo lectura.
Es una herramienta muy poderosa, y los valores no configurables son frustrantes si no puede eliminarlos.
He tenido bastantes casos en los que necesitaba corregir un error oscuro o inyectar funcionalidades ligeramente diferentes (intercepción, registro). Hacer eso requiere reemplazar el valor.
Ejemplo:
La idea es que si puede eliminar propiedades, tiene más control de meta programación. Si no pudieras eliminarlos, entonces te molestaría el idioma.
No hay una buena razón para hacer que las propiedades no sean delegables, aparte de molestar a las personas.
fuente
Todo lo contrario. Permitir la personalización es bueno porque permite a los autores de sitios web tener más flexibilidad.
Si el autor del sitio web necesita cargar código de terceros dentro de la misma JS VM y desea utilizar el analizador incorporado de JS para hacerlo, siempre puede proteger las propiedades configurándolas como no configurables antes de cargar el código de terceros.
fuente