Perché possiamo eliminare alcune proprietà predefinite dell'oggetto globale?

12

Sto leggendo es5 in questi giorni e ho trovato che l'attributo [[configurabile]] in alcune proprietà built-in dell'oggetto globale è impostato su true, il che significa che possiamo eliminare queste proprietà.

Ad esempio:

il metodo di join dell'oggetto Array.prototype ha attributi

{[[Writable]]:true, [[Enumerable]]: false, [[Configurable]]: true}

Quindi possiamo facilmente eliminare il metodo di join per Array come:

delete Array.prototype.join;
alert([1,2,3].join);

L'avviso mostrerà undefined nel mio chromium 17, firefox 9, cioè 10, even ie6;

In Chrome 15 e amp; safari 5.1.1 l'attributo [[configurable]] è impostato su true e il risultato delete è anche true ma il risultato finale è ancora function(){[native code]} . Sembra che questo sia un bug e Chromium lo risolva.

Non l'ho notato prima. A mio parere, eliminare le funzioni integrate nel codice utente è pericoloso e farà emergere così tanti bug quando si lavora con altri. Quindi perché ECMAScript prende questa decisione?

    
posta demix 23.11.2011 - 10:39
fonte

3 risposte

2

Tenderei ad essere d'accordo con te, ma d'altra parte ho appena trovato una situazione in cui dovevo delete JSON.stringify in determinate circostanze a causa di un bug in Firefox 3.5 . Certamente sono stato contento della possibilità di incorporare i buildin di scimmia lì.

    
risposta data 23.11.2011 - 12:34
fonte
1

Configurable non riguarda la cancellazione.

Riguarda la abilità per sostituire un valore di sola lettura.

È uno strumento molto potente e i valori non configurabili sono frustranti se non puoi eliminarli.

Ho avuto parecchi casi in cui ho avuto bisogno di correggere un bug oscuro o di iniettare funzionalità leggermente diverse (intercettazione, registrazione). Per farlo è necessario sostituire il valore.

Esempio:

Object.defineProperty(Object.prototype, "foo", {
  value: 42,
  configurable: true
});

var o = {};
o.foo = 50; // fails. foo is not writable
delete Object.prototype.foo;
o.foo = 50; // succeeds
/* optionally put Object.prototype.foo back */

L'idea generale è che se puoi eliminare le proprietà hai più controllo di meta-programmazione. Se non riuscissi a eliminarli, ti vergognerei semplicemente con la lingua.

Non ci sono buoni motivi per rendere le proprietà non cancellabili per infastidire le persone.

    
risposta data 24.11.2011 - 02:26
fonte
0

..delete built-in functions in user's code is dangerous

Al contrario. Consentire la personalizzazione è buono perché consente agli autori di siti Web di disporre di una maggiore flessibilità.

Se l'autore del sito web deve caricare codice di terze parti all'interno della stessa JS VM e desidera utilizzare il parser JS integrato per farlo, può sempre proteggere le proprietà impostandole su non configurabili prima di caricare il Codice di terze parti.

    
risposta data 17.10.2017 - 17:02
fonte

Leggi altre domande sui tag