Gabriel Llamas
Gabriel Llamas

Reputation: 18447

How to check if an object has been modified

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

Answers (4)

uadnal
uadnal

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

Andrew Hubbs
Andrew Hubbs

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

ThiefMaster
ThiefMaster

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

Mike Burnwood
Mike Burnwood

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

Related Questions