有替代方法吗?
还有另一种方法可以在对象中进行更改检测吗?
有代理方法,但任何人都可以告诉我如何使用代理实现这一点:
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}]
Run Code Online (Sandbox Code Playgroud)
Dan*_*nce 51
你可以通过getter和setter来实现这一点.
var obj = {
get foo() {
console.log({ name: 'foo', object: obj, type: 'get' });
return obj._foo;
},
set bar(val) {
console.log({ name: 'bar', object: obj, type: 'set', oldValue: obj._bar });
return obj._bar = val;
}
};
obj.bar = 2;
// {name: 'bar', object: <obj>, type: 'set', oldValue: undefined}
obj.foo;
// {name: 'foo', object: <obj>, type: 'get'}
Run Code Online (Sandbox Code Playgroud)
或者,在支持Proxies的浏览器中,您可以编写更通用的解决方案.
var obj = {
foo: 1,
bar: 2
};
var proxied = new Proxy(obj, {
get: function(target, prop) {
console.log({ type: 'get', target, prop });
return Reflect.get(target, prop);
},
set: function(target, prop, value) {
console.log({ type: 'set', target, prop, value });
return Reflect.set(target, prop, value);
}
});
proxied.bar = 2;
// {type: 'set', target: <obj>, prop: 'bar', value: 2}
proxied.foo;
// {type: 'get', target: <obj>, prop: 'bar'}
Run Code Online (Sandbox Code Playgroud)
Nir*_*rus 13
@Dan Prince解决方案是正确的.它应该是第一选择.
如果你想支持相当旧的浏览器,我建议你去polyfill或使用IE 9支持的Object.defineProperties API.
var obj = Object.defineProperties({}, {
"foo":{
get:function(){
console.log("Get:"+this.value);
},
set:function(val){
console.log("Set:"+val);
this.value = val;
}
},
"bar":{
get:function(){
console.log("Get:"+this.value);
},
set:function(val){
console.log("Set:"+val);
this.value = val;
}
}
});
Run Code Online (Sandbox Code Playgroud)
Gul*_*rYA 13
免责声明:我是下面建议的对象观察者库的作者.
我不会选择getter/setter解决方案 - 它很复杂,不可扩展且无法维护.Backbone以这种方式进行双向绑定,并且使其正常工作的样板是相当一部分代码.
代理是实现所需内容的最佳方式,只需在上面的示例中添加一些回调注册和管理,并在更改时执行它们.
关于polyfill库:其中一些/大多数使用"脏检查"或轮询技术实现 - 效率低,性能不高.偶尔,这是上面Nirus指出的polyfill的情况.
我建议选择一些通过Proxies进行观察的库.有一些,对象观察者就是其中之一:为这个用例准确编写,利用原生代理,提供深层树观察等.
| 归档时间: |
|
| 查看次数: |
23655 次 |
| 最近记录: |