proxy
用于代理对象、数组、函数。可以对其做一些特殊处理,把修改完的数据返回出去、
// 代理 对象let obj = {a :1}let nObj = new Proxy(obj,{get(target,property){return target[property]},set(target,property,value){return target[property] = value}})// 代理 数组let arr = ['a','b','c']let nArr = new Proxy(arr,{get(target,property){return target[property]},set(target,property,value){return target[property] = value}})console.log(nArr)nArr[0] = 'd'// 转为数组 => 不知道这种解题思路是否正确let newArr = [...new Set(nArr.values())]console.log(newArr)
常用方法
| 方法 | 描述 |
|---|---|
| handler.apply() | 拦截 Proxy 实例作为函数调用的操作 |
| handler.construct() | 拦截 Proxy 实例作为函数调用的操作 |
| handler.defineProperty() | 拦截 Object.defineProperty() 的操作 |
| handler.deleteProperty() | 拦截 Proxy 实例删除属性操作 |
| handler.get() | 拦截 读取属性的操作 |
| handler.set() | 拦截 属性赋值的操作 |
| handler.getOwnPropertyDescriptor() | 拦截 Object.getOwnPropertyDescriptor() 的操作 |
| handler.getPrototypeOf() | 拦截 获取原型对象的操作 |
| handler.has() | 拦截 属性检索操作 |
| handler.isExtensible() | 拦截 Object.isExtensible()操作 |
| handler.ownKeys() | 拦截 Object.getOwnPropertyDescriptor() 的操作 |
| handler.preventExtension() | 拦截 Object().preventExtension() 操作 |
| handler.setPrototypeOf() | 拦截Object.setPrototypeOf()操作 |
| Proxy.revocable() | 创建一个可取消的 Proxy 实例 |
get
获取代理的值
let obj = {name: '前端伪大叔'}// 第一个参数是需要代理的对象// 第二个参数代理的方法let newObj = new Proxy(obj,{// 1、代理的对象 2、代理的对象的keyget(target,property){if(property in target){return target[property]}else{console.warn(`${property}不存在`)}}})console.log(newObj.name); // 前端伪大叔console.log(newObj.Proxy);// Proxy不存在
set
修改代理的value值,可以在返回的地方返回boolean值。如果没有修改返回false
let newObj = new Proxy(obj, {// 1、代理的对象 2、key值 3、修改的keyset(target, property, value) {// 判断对象的value是否被修改if (target[property] === value) {return target[property]} else {return target[property] = value}}})console.log(newObj.name);newObj.name = '1'console.log(newObj.name);
has
针对
in操作符做的代理,
let obj = {name: '前端伪大叔',age: 19}let newObj = new Proxy(obj, {// 1、代理的对象 2、需要劫持的属性has(target, prop) {// 只有key是name的时候才返回trueif (prop === 'name') {return true} else {return false}}})console.log('name' in newObj); // trueconsole.log('age' in newObj); // false
apply
拦截函数的调用
function fun (a,b) { return a + b}let funs = new Proxy(fun,{// 1、函数本身 2、被调用的上下文对象 3、传入的参数(array格式)apply(target,thisArg,argumentsList){return argumentsList[0] + argumentsList[1] * 2}})console.log(funs(1,2));
deleteProperty
拦截删除的对象
let newObj = new Proxy(obj, {// 1、传入对象 2、keydeleteProperty(target, property) {// 只能删除对象 key值为a的if(property === 'a'){delete target[property]}else{alert('只能删除a')}}})delete newObj.a;delete newObj.b;console.log(newObj);
