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ę?
źródło
Odpowiedzi:
Chciałbym się z tobą zgodzić, ale z drugiej strony właśnie znalazłem sytuację, w której musiałem,
delete JSON.stringify
w pewnych okolicznościach, z powodu błędu w Firefoksie 3.5 . Z pewnością cieszyłem się z możliwości łatania tam wbudowanych małp.źródło
JSON.stringify
i wstrzykuje go w razie potrzeby. Przepraszam, nie wyjaśniłem tego w mojej odpowiedzi.Konfigurowalne nie dotyczy usuwania.
Chodzi o możliwość zastąpienia wartości tylko do odczytu.
Jest to bardzo potężne narzędzie, a nieskonfigurowalne wartości są frustrujące, jeśli nie można ich usunąć.
Miałem całkiem sporo przypadków, w których musiałem naprawić niejasny błąd lub wprowadzić nieco inną funkcjonalność (przechwytywanie, logowanie). W tym celu należy wymienić wartość.
Przykład:
Cały pomysł polega na tym, że jeśli możesz usunąć właściwości, masz większą kontrolę nad meta programowaniem. Jeśli nie możesz ich usunąć, po prostu denerwujesz się tym językiem.
Nie ma dobrego powodu, aby uczynić właściwości nieusuwalnymi innymi niż denerwować ludzi.
źródło
Wręcz przeciwnie. Zezwolenie na dostosowanie jest dobre, ponieważ pozwala autorom witryn na większą elastyczność.
Jeśli autor witryny musi załadować kod innej firmy w ramach tej samej maszyny wirtualnej JS i chce do tego użyć wbudowanego analizatora składni JS, zawsze może zabezpieczyć właściwości, ustawiając je na konfigurowalne przed załadowaniem kodu innej firmy.
źródło