Estou lendo es5 hoje em dia e descobri que o atributo [[configurable]] em algumas propriedades internas do objeto global está definido como true, o que significa que podemos excluir essas propriedades.
Por exemplo:
o método de junção do objeto Array.prototype possui atributos
{[[Writable]]:true, [[Enumerable]]: false, [[Configurable]]: true}
Assim, podemos excluir facilmente o método de junção da matriz, como:
delete Array.prototype.join;
alert([1,2,3].join);
O alerta será exibido undefined
no meu cromo 17, firefox 9, ou seja, 10, ou seja, 6;
No Chrome 15 e safari 5.1.1, o atributo [[configurable]] está definido como true e o resultado da exclusão também é verdadeiro, mas o resultado final ainda é function(){[native code]}
. Parece que isso é um bug e o cromo corrige.
Eu não percebi isso antes. Na minha opinião, excluir funções internas no código do usuário é perigoso e causará muitos erros ao trabalhar com outras pessoas. Então, por que o ECMAScript toma essa decisão?