响应式原理一——Proxy-Reflect

2024-06-22  本文已影响0人  LcoderQ

监听对象

Object.defineProperty 的存储属性描述符来对
属性的操作进行监听。

image.png
缺点:

Proxy

在ES6中,新增了一个Proxy类,这个类从名字就可以看出来,是用于帮助我们创建一个代理的:

const obj = {
  name: "zs",
  age: 18,
};
const objProxy = new Proxy(obj, {});

有了代理对象,就可以监听到具体的操作,只需要在handler中添加对应的捕捉器(trap)
set和get分别对应的是函数类型;
pset函数有四个参数:

使用案列:

const obj = {
  name: "zs",
  age: 18,
};
const objProxy = new Proxy(obj, {
  set: function (target, propety, newValue, receiver) {
    target[propety] = newValue;
  },
  has: function (target, key) {
    console.log("has捕捉器", key);
    return key in target;
  },

  get: function (target, key) {
    console.log("get捕捉器", key);
    return target[key];
  },

  deleteProperty: function (target, key) {
    console.log("delete捕捉器");
    delete target[key];
  },
});

console.log(objProxy.name);  //get捕捉器 name
                                                //zs

所有捕捉器

Proxy共有13个捕捉器

construct和apply

捕捉器中的construct和apply,是应用于函数对象的:

onst obj = {
  name: "zs",
  age: 18,
};

function foo() {
  console.log("foo调用", this, arguments);
  return "foo";
}
const fooProxy = new Proxy(foo, {
  apply: function (target, thisArg, argArray) {
    console.log("函数的apply监听");
    return target.apply(thisArg, argArray);
  },
  construct(target, argArray, newTarget) {
    console.log(target, argArray, newTarget);
    return new target(...argArray);
  },
});

// 函数的apply监听
// foo调用 { name: 'zs', age: 18 } [Arguments] { '0': 1, '1': 2, '2': 3 }
fooProxy.apply(obj,[1,2,3])
//[Function: foo] [ 1, 2 ] [Function: foo]
//foo调用 foo {} [Arguments] { '0': 1, '1': 2 }
new fooProxy(1,2)

Reflect的使用

Reflect也是ES6新增的一个API,它是一个对象,字面的意思是反射
Reflect作用:提供了很多操作JavaScript对象的方法,有点像Object中操作对象的方法;

我们有Object可以做这些操作,那么为什么还需要有Reflect这样的新增对象呢?

Reflect的常见方法

与Proxy是一一对应的,也是13个:

 new Proxy(obj, {
  set: function (target, propety, newValue, receiver) {
    Reflect.set(target,key,newValue)
  },
  has: function (target, key) {
    console.log("has捕捉器", key);
    return Reflect.has(target,key)
  },

  get: function (target, key) {
    console.log("get捕捉器", key);
    return Reflect.get(target,key)
  },

  deleteProperty: function (target, key) {
    console.log("delete捕捉器");
    delete Reflect.deleteProperty(target,key)
  },
});

Receiver的作用

如果我们的源对象(obj)有setter、getter的访问器属性,那么可以通过receiver来改变里面的this;


image.png

Reflect的construct

用一个类的构造器创建对象,对象却是另一个类的子类


image.png
上一篇 下一篇

猜你喜欢

热点阅读