Obsolete
This feature is obsolete. Although it may still work in some browsers, its use is discouraged since it could be removed at any time. Try to avoid using it.
The Object.observe()
method was used for asynchronously observing the changes to an object. It provided a stream of changes in the order in which they occur. However, this API has been deprecated and removed from browsers. You can use the more general Proxy
object instead.
Syntax
Object.observe(obj, callback[, acceptList])
Parameters
obj
- The object to be observed.
callback
- The function called each time changes are made, with the following argument:
changes
- An array of objects each representing a change. The properties of these change objects are:
name
: The name of the property which was changed.object
: The changed object after the change was made.type
: A string indicating the type of change taking place. One of"add"
,"update"
, or"delete"
.oldValue
: Only for"update"
and"delete"
types. The value before the change.
acceptList
- The list of types of changes to be observed on the given object for the given callback. If omitted, the array
["add", "update", "delete", "reconfigure", "setPrototype", "preventExtensions"]
will be used.
Return value
The object to be observed.
Description
callback
is called each time a change is made to obj
, with an array of all changes in the order in which they occurred.
Examples
Logging all six different types
var obj = { foo: 0, bar: 1 }; Object.observe(obj, function(changes) { console.log(changes); }); obj.baz = 2; // [{name: 'baz', object: <obj>, type: 'add'}] obj.foo = 'hello'; // [{name: 'foo', object: <obj>, type: 'update', oldValue: 0}] delete obj.baz; // [{name: 'baz', object: <obj>, type: 'delete', oldValue: 2}] Object.defineProperty(obj, 'foo', {writable: false}); // [{name: 'foo', object: <obj>, type: 'reconfigure'}] Object.setPrototypeOf(obj, {}); // [{name: '__proto__', object: <obj>, type: 'setPrototype', oldValue: <prototype>}] Object.seal(obj); // [ // {name: 'foo', object: <obj>, type: 'reconfigure'}, // {name: 'bar', object: <obj>, type: 'reconfigure'}, // {object: <obj>, type: 'preventExtensions'} // ]
Data Binding
// A user model var user = { id: 0, name: 'Brendan Eich', title: 'Mr.' }; // Create a greeting for the user function updateGreeting() { user.greeting = 'Hello, ' + user.title + ' ' + user.name + '!'; } updateGreeting(); Object.observe(user, function(changes) { changes.forEach(function(change) { // Any time name or title change, update the greeting if (change.name === 'name' || change.name === 'title') { updateGreeting(); } }); });
Custom change type
// A point on a 2D plane var point = {x: 0, y: 0, distance: 0}; function setPosition(pt, x, y) { // Performing a custom change Object.getNotifier(pt).performChange('reposition', function() { var oldDistance = pt.distance; pt.x = x; pt.y = y; pt.distance = Math.sqrt(x * x + y * y); return {oldDistance: oldDistance}; }); } Object.observe(point, function(changes) { console.log('Distance change: ' + (point.distance - changes[0].oldDistance)); }, ['reposition']); setPosition(point, 3, 4); // Distance change: 5
Specifications
Strawman proposal specification.
Browser compatibility
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 36 [1] | No support [2] | No support [3] | 23 | No support |
Feature | Android | Android Webview | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
---|---|---|---|---|---|---|---|
Basic support | No support | (Yes) [1] | No support [2] | No support [3] | 23 | No support | 36[1] |
[1] Deprecated in Chrome 49 and flagged off in Chrome 50 and entirely removed in Chrome 52
[2] See bug 800355
[3] See relevant MS Edge platform status entry