gpt4 book ai didi

javascript - 为什么不推荐使用 Object.observe()

转载 作者:IT王子 更新时间:2023-10-29 03:06:08 26 4
gpt4 key购买 nike

是否有替代方法?

还有其他方法可以在对象中进行变化检测吗?

有代理方法,但谁能告诉我如何使用代理来实现:

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}]

最佳答案

您可以使用 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'}

或者,在支持代理的浏览器中,您可以编写更通用的解决方案。

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'}

关于javascript - 为什么不推荐使用 Object.observe(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36258502/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com