Czytam teraz es5 i stwierdzam, że atrybut [[konfigurowalny]] w niektórych wbudowanych właściwościach obiektu globalnego jest ustawiony na true, co oznacza, że możemy usunąć te właściwości.
Na przykład:
metoda łączenia obiektu Array.prototype ma atrybuty
{[[Writable]]:true, [[Enumerable]]: false, [[Configurable]]: true}
Możemy więc łatwo usunąć metodę łączenia dla Array, taką jak:
delete Array.prototype.join;
alert([1,2,3].join);
undefined
Ostrzeżenie wyświetli się w moim chromie 17, firefox 9, tj. 10, a nawet ie6;
W Chrome 15 i Safari 5.1.1 atrybut [[konfigurowalny]] jest ustawiony na wartość true, a usunięcie wyniku jest również prawdą, ale wynik końcowy jest nadal function(){[native code]}
. Wygląda na to, że jest to błąd i chrom go naprawia.
Nie zauważyłem tego wcześniej. Moim zdaniem usuwanie wbudowanych funkcji w kodzie użytkownika jest niebezpieczne i spowoduje wiele błędów podczas pracy z innymi. Dlaczego więc ECMAScript podejmuje taką decyzję?