Please be sure to read all the comments below. Object.Watch and Object.Observe are both deprecated. See Elliot B\'s comment for an updated (as of Jun 2018) method.
I was looking for an easy way to monitor an object or variable for changes, and I found Object.watch()
, that\'s supported in Mozilla browsers, but not IE. So I started searching around to see if anyone had written some sort of equivalent.
About the only thing I\'ve found has been a jQuery plugin, but I\'m not sure if that\'s the best way to go. I certainly use jQuery in most of my projects, so I\'m not worried about the jQuery aspect...
Anyway, the question: Can someone show me a working example of that jQuery plugin? I\'m having problems making it work...
Or, does anyone know of any better alternatives that would work cross browser?
Update after answers:
Thanks everyone for the responses! I tried out the code posted here:
http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html
But I couldn\'t seem to make it work with IE. The code below works fine in Firefox, but does nothing in IE. In Firefox, each time watcher.status
is changed, the document.write()
in watcher.watch()
is called and you can see the output on the page. In IE, that doesn\'t happen, but I can see that watcher.status
is updating the value, because the last document.write()
call shows the correct value (in both IE and FF). But, if the callback function isn\'t called, then that\'s kind of pointless... :)
Am I missing something?
var options = {\'status\': \'no status\'},
watcher = createWatcher(options);
watcher.watch(\"status\", function(prop, oldValue, newValue) {
document.write(\"old: \" + oldValue + \", new: \" + newValue + \"<br>\");
return newValue;
});
watcher.status = \'asdf\';
watcher.status = \'1234\';
document.write(watcher.status + \"<br>\");
(Sorry for the cross-posting, but this answer I gave to a similar question works fine here)
I have created a small object.watch shim for this a while ago. It works in IE8, Safari, Chrome, Firefox, Opera, etc.
That plugin simply uses a timer/interval to repeatedly check for changes on an object. Maybe good enough but personally I would like more immediacy as an observer.
Here\'s an attempt at bringing watch
/unwatch
to IE: http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html.
It does change the syntax from the Firefox way of adding observers. Instead of :
var obj = {foo:\'bar\'};
obj.watch(\'foo\', fooChanged);
You do:
var obj = {foo:\'bar\'};
var watcher = createWatcher(obj);
watcher.watch(\'foo\', fooChanged);
Not as sweet, but as an observer you are notified immediately.
Current Answer
Use the new Proxy object, which can watch changes to it\'s target.
let validator = {
set: function(obj, prop, value) {
if (prop === \'age\') {
if (!Number.isInteger(value)) {
throw new TypeError(\'The age is not an integer\');
}
if (value > 200) {
throw new RangeError(\'The age seems invalid\');
}
}
// The default behavior to store the value
obj[prop] = value;
// Indicate success
return true;
}
};
let person = new Proxy({}, validator);
person.age = 100;
console.log(person.age); // 100
person.age = \'young\'; // Throws an exception
person.age = 300; // Throws an exception
Old answer from 2015
You could have used Object.observe() from ES7. Here\'s a polyfill. But Object.observe() is now cancelled. Sorry people!
Note that in Chrome 36 and higher you can use Object.observe
as well. This is actually a part of a future ECMAScript standard, and not a browser-specific feature like Mozilla\'s Object.watch
.
Object.observe
only works on object properties, but is a lot more performant than Object.watch
(which is meant for debugging purposes, not production use).
var options = {};
Object.observe(options, function(changes) {
console.log(changes);
});
options.foo = \'bar\';
you can use Object.defineProperty.
watch the property bar
in foo
Object.defineProperty(foo, \"bar\", {
get: function (val){
//some code to watch the getter function
},
set: function (val) {
//some code to watch the setter function
}
})
I have used Watch.js in one of my projects. And it is working fine.One of the main advantage of using this library is :
\"With Watch.JS you will not have to change the way you develop.\"
The example is given below
//defining our object however we like
var ex1 = {
attr1: \"initial value of attr1\",
attr2: \"initial value of attr2\"
};
//defining a \'watcher\' for an attribute
watch(ex1, \"attr1\", function(){
alert(\"attr1 changed!\");
});
//when changing the attribute its watcher will be invoked
ex1.attr1 = \"other value\";
<script src=\"https://cdn.jsdelivr.net/npm/melanke-watchjs@1.5.0/src/watch.min.js\"></script>
This is as simple as this!
I also think that right now the best solution is to use Watch.JS, find a nice tutorial here: Listen/Watch for object or array changes in Javascript (Property changed event on Javascript objects)