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


12

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

Per esempio:

il metodo join dell'oggetto Array.prototype ha attributi

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

Quindi possiamo facilmente eliminare il metodo join per Array come:

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

L'allarme mostrerà undefinednel mio chrome 17, firefox 9, ovvero 10, anche ie6;

In Chrome 15 e safari 5.1.1 l'attributo [[configurabile]] è impostato su true e anche il risultato dell'eliminazione è vero ma il risultato finale è ancora function(){[native code]}. Sembra che questo sia un bug e il cromo lo risolva.

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


Le risposte multiple lodano la possibilità di personalizzare la funzionalità integrata eliminando le proprietà, ma questo approccio è necessario solo perché la funzionalità è cablata nelle variabili globali invece di utilizzare DI. Sembra che la personalizzazione eliminando le proprietà sia un trucco attorno a un design fondamentalmente cattivo. Ad esempio, se è necessario poter modificare il parser JSON, è possibile scrivere come input un codice che accetta un parser JSON.
Ripristina Monica il

Risposte:


2

Vorrei essere d'accordo con te, ma d'altra parte ho appena trovato una situazione in cui avevo bisogno delete JSON.stringifyin determinate circostanze a causa di un bug in Firefox 3.5 . Sono stato sicuramente contento della capacità di rattoppare le scimmie all'interno.


Perché non lo ignori?
demix

2
Perché la prossima cosa che succede è che JSON2.js viene caricato, che rileva la presenza JSON.stringifye la inietta se necessario. Mi scuso, non l'ho spiegato nella mia risposta.
N3dst4,

Quindi puoi modificare anche il codice sorgente di JSON2.js, lol
demix

È una cattiva idea modificare le librerie di terze parti perché non è possibile aggiornarle senza copiare tutte le modifiche.
N3dst4,

1

Configurabile non riguarda la cancellazione.

Si tratta della possibilità di 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 avevo bisogno di correggere un bug oscuro o iniettare funzionalità leggermente diverse (intercettazione, registrazione). Ciò richiede la sostituzione del 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 è che se riesci a eliminare le proprietà hai più controllo meta-programmazione. Se non riesci a eliminarli, ti arrabbieresti semplicemente con la lingua.

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


1
L'attributo [[scrivibile]] controlla la possibilità di modificare il valore. In ES5: [[scrivibile]] Booleano Se falso, i tentativi del codice ECMAScript di modificare l'attributo [[Valore]] della proprietà utilizzando [[Put]] non avranno esito positivo . [[Configurabile]] Booleano Se falso, tenta di eliminare la proprietà, cambia la proprietà in una proprietà accessor o modifica i suoi attributi (diversi da [[Valore]]) fallirà.
demix

@demix Sì, è corretto ...
Raynos,

0

..elimina le funzioni integrate nel codice dell'utente è pericoloso

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

Se l'autore del sito Web deve caricare codice di terze parti all'interno della stessa VM JS 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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.