현재 번역은 완벽하지 않습니다. 한국어로 문서 번역에 동참해주세요.
This is an experimental technology, part of the ECMAScript 2016 (ES7) proposal.
Because this technology's specification has not stabilized, check the compatibility table for usage in various browsers. Also note that the syntax and behavior of an experimental technology is subject to change in future version of browsers as the spec changes.
Object.observe()
메소드는 객체의 변화를 비동기로 감시하는데에 사용된다. 이 메소드는 변화들이 발생한 순서대로 그 흐름을 제공한다.
문법
Object.observe(obj, callback[, acceptList])
파라미터
obj
- 감시될 대상.
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.
설명
callback
is called each time a change is made to obj
, with an array of all changes in the order in which they occurred.
예제
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'} // ]
데이터 바인딩
// 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 for ECMAScript 7.
브라우저 호환성
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 36 | Not supported [1] | Not supported [2] | 23 | Not supported |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | Not supported | 36 | Not supported [1] | Not supported [2] | 23 | Not supported |
[1]: See bug 800355
[2]: See relevant MS Edge platform status entry