2012-02-02 8 views
13

Uso Object.freeze come mezzo per evitare di infrangere le mie regole. Vorrei che Object.freeze mi parlasse quando provo a fare un cattivo incarico. Tuttavia, Object.freeze fa semplicemente fallire i compiti in modo silenzioso! Ad esempio, se faccioC'è un modo per far sì che un oggetto "Object.frozen" lanci avvertimenti quando si tenta di cambiarlo?

/* 
* Frozen singleton object "foo". 
*/ 
var foo = (function() { 
    var me = {}; 

    me.bar = 1; 

    if (Object.freeze) { 
    Object.freeze(me); 
    } 

    return me; 
})(); 

foo.bar = 2; 
console.log(foo.bar); 

console registrerà "1", ma non sa che io abbia mai fatto una cattiva assegnazione. Questo ovviamente può portare a comportamenti pericolosi inaspettati nel mio codice, quando l'intero punto di congelamento dell'oggetto era quello di evitare l'imprevisto. In effetti, sono più propenso a ottenere un output dettagliato di errore non bloccando l'oggetto, lasciando che il cattivo compito abbia luogo e avendo il mio codice fallito in seguito a causa del valore errato.

Mi chiedo se JavaScript abbia un pragma nascosto di "avviso di oggetto immutabile" in qualsiasi browser, in modo che possa sapere quando tento di mutare un oggetto "Object.frozen".

+0

Questo non è supportato in IE8 e versioni precedenti, e possibilmente in alcuni altri browser. Penso che tu stia solo cercando guai. Almeno, prova tutti i browser. –

+0

@Hari, non sto usando Object.freeze in alcun modo che cambi il flusso del mio programma. Voglio solo usarlo come strumento di sicurezza per me stesso. Non oserei ** dipendere ** da una funzione non supportata! – Milosz

risposta

18

Il codice in modalità rigorosa genera un valore TypeError quando si tenta di assegnare a una proprietà non scrivibile (ECMA-262: 11.13.1). Ma notate che non potete contare sull'errore generato nei browser che non supportano completamente la modalità rigorosa ES5 (come IE9).

Per rendere il codice eseguito in modalità rigorosa, aggiungere 'use strict'; all'inizio del file JS o la funzione contenente il codice ed eseguirlo in un ambiente che implementa la modalità rigorosa (vedere ad esempio questo elenco: http://caniuse.com/#feat=use-strict).

+0

Questo è esattamente quello che stavo cercando. Safari registrerà 'TypeError: Tentativo di assegnare alla proprietà readonly.' quando tento di fare un cattivo incarico Naturalmente, non lo userò nei blocchi 'try {} catch() {}' a causa della mancanza di supporto affidabile per l'eccezione; è solo uno strumento di sicurezza per la codifica per me stesso. Grazie molto! – Milosz

Problemi correlati