Reputation: 18447
I have an object, for example:
var o = {
a: 1
};
The user does:
o.a = 2;
How can I know if the o
object has been modified? I cannot touch the o
object so I cannot use Object.defineProperties()
.
Upvotes: 7
Views: 8820
Reputation: 11445
You could always wrap o
with your own setter getter if the defineProperty
doesn't do the job for you.
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
A better solution would be to execute an event using something like Backbone.Events
to 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);
I'm using the Underscore
library's extend
method here, fyi.
Upvotes: 0
Reputation: 9436
The easiest thing would obviously be to just check if the value is different than what you initialized it as. Another option would be to use 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
}
});
Upvotes: 2
Reputation: 318808
Since you are in the node.js environment and thus don't have to care about crappy old JavaScript engines (i.e. old browsers) you can use Object.defineProperty()
to define properties with accessor functions. This allows you to execute a custom function whenever a certain property is read/written - so you can simply log the write and e.g. store it in a separate property.
var o = {};
Object.defineProperty(o, 'a', {
get: function() {
return this.__a;
},
set: function(value) {
this.__a = value;
this.__a_changed = true;
}
});
o.__a = 1;
Whenever a value is assigned to o.a
the __a_changed
property will be set. Of course it would be even cleaner to execute whatever you want to do on change right in the set
function - but it obviously depends on your code if you can do so in a useful way.
Upvotes: 3
Reputation: 279
var o_backup = o.a;
if(o.a != o_backup){
// function to execute
}
Basically, you are just creating a variable which will save the a
from the object o
and then you're checking if it has been modified or not.
Also, you can do a setInterval()
function if you want to check if it has been modified more than once.
Upvotes: -1