JavaScript代理是否应该拦截对Object.Observe等底层对象的直接更改? [英] Is JavaScript Proxy supposed to intercept direct changes to underlying object like Object.Observe?

查看:65
本文介绍了JavaScript代理是否应该拦截对Object.Observe等底层对象的直接更改?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

MDN for Object.Observe 说Observe现在已经过时了,我们应该使用更通用的代理对象。



但Observe允许拦截对现有对象的更改。如果Proxy不允许,则Proxy API不会比Observable API更通用。



MDN for Proxy 这个问题提供了对代理对象进行拦截更改的示例,但从未谈及对底层对象的更改。



代理是否应该拦截当前或未来ECMA标准中对基础对象的更改?



示例:

  let o = {}; 
let p = new Proxy(o,{set:(target,prop,val)=> console.log(target,prop,val)});
p.p1 ='v1'; //这将记录o,p1,v1
o.p2 ='v2'; //这是否应该在ECMA标准中记录o,p2,v2?


解决方案


o.p2 ='v2'; //这是否应该以ECMA标准记录o,p2,v2?


不,使用该特定模式。



代理对象设置值,值将设置为 target object。



虽然你也可以定义 getter at

  var obj = {get getProp(){returnobj getter:+(this [x] || void 0); var proxy = new Proxy(obj,{set:function(obj,prop,newval){var oldval = obj [prop]; console.log(set,oldval,obj,prop,newval); obj [ prop] = newval;},get:function(obj,prop){console.log(get,obj,prop);}}); proxy.x = 1; console.log(obj.x); console。 log(obj.getProp);  


MDN for Object.Observe says that Observe is now obsolete and we should use "more general Proxy object instead".

But Observe allowed to intercept changes on existing object. If Proxy does not allow then Proxy API is not "more general" than Observable API.

MDN for Proxy and this question give examples of intercepting changes to proxy object, but never talk about changes to underlying object.

Is Proxy supposed to intercept changes to underlying object in current or future ECMA standard ?

Example:

let o = {};
let p = new Proxy(o, { set: (target, prop, val)=> console.log(target, prop, val) });
p.p1 = 'v1'; // this will log o, "p1", "v1"
o.p2 = 'v2'; // is this supposed to log o, "p2", "v2" in ECMA standard ?

解决方案

o.p2 = 'v2'; // is this supposed to log o, "p2", "v2" in ECMA standard ?

No, using that particular pattern.

Set the value at the Proxy object, and value will be set at target object.

Though you can also define getter at original object.

var obj = {
  get getProp() {
    return "obj getter: " + (this["x"] || void 0);
  }
};

var proxy = new Proxy(obj, {
  set: function(obj, prop, newval) {
    var oldval = obj[prop];
    console.log("set", oldval, obj, prop, newval);
    obj[prop] = newval;
  }, get: function(obj, prop) {
       console.log("get", obj, prop);
  }
});

proxy.x = 1;

console.log(obj.x);

console.log(obj.getProp);

这篇关于JavaScript代理是否应该拦截对Object.Observe等底层对象的直接更改?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆