2013-01-06 15 views
5

ho un oggetto, ad esempio:Come verificare se un oggetto è stato modificato

var o = { 
    a: 1 
}; 

L'utente fa:

o.a = 2; 

Come faccio a sapere se l'oggetto o è stato modificato? Non riesco a toccare l'oggetto o, quindi non posso utilizzare Object.defineProperties().

+0

Vuoi ricevere una notifica per ogni cambiamento o semplicemente avere un modo per controllarlo? Se si desidera verificare, direi generare un codice hash dell'oggetto e confrontarlo quando necessario. – Nic

+0

Basta avere un modo per controllarlo, ma come posso generare questo hash? –

risposta

-1
var o_backup = o.a; 

if(o.a != o_backup){ 
// function to execute 
} 

In sostanza, si sta solo creando una variabile che salverà il a dall'oggetto o e poi si sta controllando se è stato modificato o meno.

Inoltre, è possibile eseguire una funzione setInterval() se si desidera verificare se è stata modificata più di una volta.

+0

Senza offesa, ma questa non è una soluzione molto elegante. – Trevor

2

Dal momento che sono nell'ambiente node.js e quindi non c'è bisogno di preoccuparsi di motori JavaScript vecchi scadenti (vale a dire i vecchi browser) è possibile utilizzare Object.defineProperty() per definire le proprietà con funzioni di accesso. Ciò ti consente di eseguire una funzione personalizzata ogni volta che una determinata proprietà viene letta/scritta, quindi puoi semplicemente registrare la scrittura e ad es. memorizzarlo in una proprietà separata.

var o = {}; 
Object.defineProperty(o, 'a', { 
    get: function() { 
     return this.__a; 
    }, 
    set: function(value) { 
     this.__a = value; 
     this.__a_changed = true; 
    } 
}); 
o.__a = 1; 

Ogni volta che un valore viene assegnato a o.a sarà impostare la proprietà __a_changed. Ovviamente sarebbe ancora più pulito eseguire qualunque cosa tu voglia cambiare al momento giusto nella funzione set - ma ovviamente dipende dal tuo codice se puoi farlo in un modo utile.

+0

Come la prima risposta, non posso toccare l'oggetto 'o' perché è stato creato da un file di configurazione con un modulo di terze parti. –

+2

È ancora possibile convertire tutte le proprietà normali in proprietà supportate dagli utenti. – ThiefMaster

2

La cosa più semplice sarebbe ovviamente controllare solo se il valore è diverso da quello che è stato inizializzato come. Un'altra opzione potrebbe essere quella di utilizzare Object.defineProperty.

var o = {}; 
var aValue = 2; 
Object.defineProperty(o, "a", { 
    get: function() { return aValue; }, 
    set: function(newValue) { 
     aValue = newValue; 
     // trigger event or set flag that it was changed 
    } 
}); 
+0

Il problema è che non riesco a toccare l'oggetto 'o' perché è stato creato da un file di configurazione con un modulo di terze parti. –

+0

Supponendo che non si possa realmente toccare l'oggetto 'o', non si possono avere molte opzioni oltre a controllare il valore rispetto a un valore previsto. Non ci sono eventi che vengono automaticamente attivati ​​quando un oggetto ole semplice ha una proprietà modificata. –

0

Si può sempre avvolgere o con il proprio setter getter se il defineProperty non fa il lavoro per voi.

var myO = { 
    o: o, // original o 
    changed: false, 
    set: function (prop, val) { 
     this.o[prop] = val; 
     this[prop + "IsChanged"] = true; 
    }, 
    get: function (prop) { 
     return this.o[prop]; 
    } 
}; 
myO.set("a", 2); 
console.log(myO.aIsChanged); // true 

Una soluzione migliore sarebbe quella di eseguire un evento con qualcosa di simile a Backbone.Events exeute someting myO.on("change", function() { ... })

var myO = { 
     o: o, // original o 
     changed: false, 
     set: function (prop, val) { 
      this.o[prop] = val; 
      this.trigger("change", prop, val); 
     }, 
     get: function (prop) { 
      return this.o[prop]; 
     } 
    }; 

_.extend(myO, Backbone.events); 

myO.on("change", function (prop, val) { 
    // Do stuff with the change 
}); 

myO.set("a", 1); 

sto usando il metodo della biblioteca Underscoreextend qui, FYI.

Problemi correlati