现在已经是 2018 年了,这个问题的答案有点过时了:
-
对象.watch and 对象观察两者均已弃用,不应使用。
-
属性更改时是一个 DOM 元素事件处理程序,仅适用于某些版本的 IE。
-
对象.defineProperty允许您使对象属性不可变,这将允许您检测尝试的更改,但它也会阻止任何更改。
-
定义 setter 和 getter可以,但它需要大量的设置代码,并且当您需要删除或创建新属性时它不能很好地工作。
Today, 您现在可以使用Proxy object监视(并拦截)对对象所做的更改。它是专门为 OP 想要做的事情而构建的。这是一个基本示例:
var targetObj = {};
var targetProxy = new Proxy(targetObj, {
set: function (target, key, value) {
console.log(`${key} set to ${value}`);
target[key] = value;
return true;
}
});
targetProxy.hello_world = "test"; // console: 'hello_world set to test'
唯一的缺点是Proxy
对象是:
- The
Proxy
对象在较旧的浏览器(例如 IE11)中不可用,并且polyfill无法完全复制Proxy
功能。
- 代理对象并不总是按照特殊对象的预期运行(例如,
Date
) - 这Proxy
对象最好与普通对象或数组配对。
如果您需要观察对嵌套对象,那么你需要使用专门的库,例如可观察的苗条(我创作的)。它的工作原理如下:
var test = {testing:{}};
var p = ObservableSlim.create(test, true, function(changes) {
console.log(JSON.stringify(changes));
});
p.testing.blah = 42; // console: [{"type":"add","target":{"blah":42},"property":"blah","newValue":42,"currentPath":"testing.blah",jsonPointer:"/testing/blah","proxy":{"blah":42}}]