2009-06-27 13 views
12

Ho appena letto questo: http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspxLa sovrascrittura del costruttore Array non ha effetto su [], giusto?

ho avuto l'impressione che sovrascrivendo Object o Array ha avuto effetto solo se si è scelto di utilizzare le funzioni di costruzione per la creazione arrays/objects, ma, secondo questo articolo, ha anche un effetto sulla creazione letterale ({} e []) ...

La mia logica:

Array = function(){ alert('Hi'); }; 

[1,2,3,4,5]; 
([1,2,3,4,5]); 
var a = [1,2,3,4,5]; 

// ... 
// ... Nothing is alerted 

Così, sto andando pazzo o ci sono alcune stranezze specifici dell'implementazione io non sono a conoscenza?

risposta

14

Per quanto ne so, questo è un problema con le specifiche ECMAScript ed è stato corretto in tutti i principali browser più di un anno fa. Here è un link che si collega ai link più rilevanti;)

Ma per rispondere alla tua domanda in realtà, sì, i Object e Array costruttori sono anche invocati per le creazioni letterali. La correzione risolta con i browser implementati ha reso questi (e altri) costanti in modo che non possano essere sovrascritti da script personalizzati.

+1

Perfetto! Grazie per il collegamento :) – James

0

Impostando Array come funzione non si esegue l'override del costruttore di array, ma sostituendo la funzione.

Per eseguire correttamente l'override del costruttore, si utilizzerà Array.prototype. defineSetter per impostare il metodo chiamato in costruzione, e questo sarebbe chiamato sia sul nuovo array() che quando si utilizza la notazione letterale.

+1

Non vero in base alla sezione 11.4.1 della specifica EcmaScript 262. –

5

La bozza di EcmaScript 5 standardizza questa correzione che Josef menziona. Specifica il comportamento del costruttore di array in termini di valore dell'array globale al momento della creazione del contesto, come descritto nella sezione 11.1.4.

semantica

La produzione ArrayLiteral : [ Elisionopt ] è valutata come segue:

  1. Let matrice sia il risultato di creare un nuovo oggetto come per l'espressione new Array() dove Array è lo standard incorporato costruttore con quel nome.

posto del vecchio ES 262 comportamento che ha consentito per la sostituzione di costruzione Array:

semantica

La produzione ArrayLiteral : [ Elisionopt ] è valutata come segue:

  1. Crea nuovo array come se dall'espressione new Array().

Detto questo, non si basano su [] lavorare sensibilmente sulla interpreti più anziani.

Problemi correlati