美文网首页
认识Proxy

认识Proxy

作者: 别过经年 | 来源:发表于2020-12-13 00:26 被阅读0次

1.应用场景

  • vue 数据劫持
  • immer 实现immutable数据
  • qiankun实现js环境的隔离

2. 实例

  • defineProperty
    数组的设置
const p = new Proxy([], {
  defineProperty(target, prop, descriptor) {
    console.info("defineProperty", target, prop, descriptor);
    return Reflect.defineProperty(target, prop, descriptor);
  },
});

p.push(100); // 会触发defineProperty,会使p更新
p[1] = "ooo"; // 会触发defineProperty,会使p更新
console.info(p);

以上两种方式都会触发defineProperty

Detecting changes in a Javascript array using the Proxy object

对象的设置

const obj = { age: 10 };

const p = new Proxy(obj, {
  defineProperty: function (target, p, attributes) {
    console.info("defineProperty");
    return Reflect.defineProperty(target, p, attributes);
  },
});

p.title = "xxzxx"; // 会触发defineProperty,会使p更新
Object.defineProperty(p, "lll", { value: "oooo" }); // 会触发defineProperty,不会使p更新
console.info("ret:", p);
  • set
    深度设置
const obj = { age: 10, person: { age: 99 } };

const p = new Proxy(obj, {
  set: function (target, p, value, receiver) {
    console.info("set", target, p, value);
    return Reflect.set(target, p, value, receiver);
  },
});

p.person.title = 199;
// p.title = 199;

console.info(p);

输出:
{ age: 10, person: { age: 99, title: 199 } }
p被改变了,但是set函数没被调用,深度属性并不能被劫持

相关文章

网友评论

      本文标题:认识Proxy

      本文链接:https://www.haomeiwen.com/subject/iekugktx.html