使用Object.create可以在javascript中定义setter和getter方法。
o = Object.create(Object.prototype, {
fooBar: {
get: function() { return "Meh" },
set: function(value) { console.log(value) }
}
});
console.log(o)
将始终返回Meh,而o = "Heyo"
只会直接输出新值,而不会更改o
。
有什么理由说明为什么我不应该使用或依赖此行为来触发事件? 那么像angular和ember这样的双向绑定框架呢,他们会使用这个功能吗? 那么单元测试呢?
在不使用显式设置器和getter的情况下,观察触发事件更改的事实标准方法是什么?
答案 0 :(得分:1)
有三种方法可以观察JavaScript对象的变化:
方法1很简单。如果你想使用setter / getter取决于你。还可以选择使用它们:
var someValue = 0;
this.myMethod = function(newValue) {
if (arguments.length === 0) return someValue; /// gets if no arg is given
someValue = newValue; /// sets if arg is given
return this;
}
干净而直接。
如果要使用属性,则需要使用定时器进行轮询,或者可以使用对象观察器。
然而,目前对Object观察者的支持并不是那么好(我上次检查过)。 Chrome有支持,Firefox有自己的观察系统等等,所以如果你使用那些,你需要准备你的代码来处理不受支持的情况。这基本上意味着您需要进行轮询。因此,使用set / get等方法是一种更好的方法IMO。
观察者对属性很有用。它允许您以这种方式设置属性:
myObject.value = 10;
并触发一个允许您处理该更改的回调。请注意,它将触发任何属性更改的回调,因此需要迭代事件。
例如:
Object.observe(myObject, observerCallback);
function observerCallback(records) {
records.forEach(checkRecord);
}
function checkRecord(rec) {
switch(rec.name) {
case 'value':
handleValueChange();
break;
}
}