使用Javascript setter和getter属性监视更改是一个坏主意吗?
使用Object.create可以在Javascript中定义setter和getter方法使用Javascript setter和getter属性监视更改是一个坏主意吗?,javascript,angularjs,ember.js,jasmine,dom-events,Javascript,Angularjs,Ember.js,Jasmine,Dom Events,使用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 = Object.create(Object.prototype, {
fooBar: {
get: function() { return "Meh" },
set: function(value) { console.log(value) }
}
});
console.log(o)
将始终返回Meh,执行o=“Heyo”
操作将仅直接输出新值,而不会更改o
有什么理由不应该使用或依靠这种行为来触发事件吗?
那么像angular和ember这样的双向绑定框架呢,它们利用了这个特性吗?
那么单元测试呢
在不使用显式setter和getter的情况下,观察触发事件的更改的实际标准方法是什么?观察JavaScript对象中的更改有三种方法:
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;
}
它是干净和直接的
如果要使用属性,则需要使用计时器进行轮询,也可以使用对象观察者
但是,当前对对象观察者的支持并没有那么好(上次我检查时)。Chrome有支持,Firefox有自己的observer系统等等,所以如果您使用这些系统,您需要准备代码来处理不支持它的情况。这基本上意味着你需要投票。因此,set/get等方法是一种较好的方法
观察者对属性很有用。它将允许您通过以下方式设置属性:
myObject.value = 10;
并触发一个回调,允许您处理该更改。注意,它将在任何属性更改时触发回调,因此需要迭代事件
例如:
Object.observe(myObject, observerCallback);
function observerCallback(records) {
records.forEach(checkRecord);
}
function checkRecord(rec) {
switch(rec.name) {
case 'value':
handleValueChange();
break;
}
}
有三种方法可以观察JavaScript对象中的更改:
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;
}
它是干净和直接的
如果要使用属性,则需要使用计时器进行轮询,也可以使用对象观察者
但是,当前对对象观察者的支持并没有那么好(上次我检查时)。Chrome有支持,Firefox有自己的observer系统等等,所以如果您使用这些系统,您需要准备代码来处理不支持它的情况。这基本上意味着你需要投票。因此,set/get等方法是一种较好的方法
观察者对属性很有用。它将允许您通过以下方式设置属性:
myObject.value = 10;
并触发一个回调,允许您处理该更改。注意,它将在任何属性更改时触发回调,因此需要迭代事件
例如:
Object.observe(myObject, observerCallback);
function observerCallback(records) {
records.forEach(checkRecord);
}
function checkRecord(rec) {
switch(rec.name) {
case 'value':
handleValueChange();
break;
}
}