Proxy与它的13个捕获器函数。

Proxy有13个捕获器

get() :获取值得捕获器 用来获取是否读取属性。

    // 获取值得捕获器
    // 当用户获取值得时候自动回调,objProxy.name 自动get()
    // 接受三个参数  
    // target ---> objProxy 所代理得对象    
    // key --- > 对象的key
    // receiver ---> 当前代理的对象 
	const obj = { name: "韩程远", age: 18 }
	const objProxy = new Proxy(obj, {
    get(target, key, receiver) {
        console.log(`监听到objProxy的${key}发生被获取了`)
        return target[key]
    }
   }

在这里插入图片描述

set():捕获器用来获取是否设置/修改属性。

置值的回调函数自动会掉 objProxy.name = “韩”
接受四个参数 target key newval receiver
newVal 设置的值。

    // 设置值的回调函数自动会掉 objProxy.name = "韩" 
    // 接受四个参数 target key newval  receiver
    // newVal 设置的值。
    set(target, key, newVal, receiver) {
        console.log(`监听到objProxy的${key}被设置`)
        target[key] = newVal;
    },

在这里插入图片描述

has() : 捕获器 用来判断 属性是否在捕获器当中。

监听in方法的捕获器,has捕获器

 // 监听in方法的捕获器,has捕获器
    // 接受两个参数  target 和 key
    has(target,key){
        console.log(`监听到objProxy的${key}的in操作`,target)
        return key in target
    },

在这里插入图片描述

deleteProperty() :用来监听捕获器的删除操作。

  // 监听到delect 捕获器
    deleteProperty(target,key){
        console.log(`监听到objProxy的${key}的delect操作`,target)
        delete target[key]
    },

在这里插入图片描述

getPrototypeOf():当读取代理对象的原型时,该方法就会被调用。

 getPrototypeOf(target){
        return target
    }
 console.log(Object.getPrototypeOf(objProxy)) 

在这里插入图片描述

apply() 方法用于拦截函数的调用。


function sum(a, b) {
    return a + b;
}
// thisArg 被调用的时候它的作用域对象
// argumentsList 被调用的时候的参数数组

const sumProxy = new Proxy(sum, {
    apply(target, thisArg, argumentsList) {
        console.log(`打印参数: ${argumentsList}`);
        return target(argumentsList[0], argumentsList[1]) * 10;
    }
})
console.log(sum(1, 2));   // 3 
console.log(sumProxy(1, 2));  // 30

在这里插入图片描述

construct() :捕获器,用来拦截new 操作符。

// construct 用来拦截new 操作符,为了使new操作符生成的Proxy对象上生效,
// 用于初始化代理的目标对象自身必须有[Construct]内部方法。new target必须有效

function mosterl(disposition) {
    this.disposition = disposition;
}

const mosterlProxy = new Proxy(mosterl,{
    construct(target,args){
        console.log(target)
        console.log(`输出一下啊 ${target.name}`)
        return new target(...args)
    }
})

console.log(new mosterlProxy("fierce").disposition)

在这里插入图片描述

defineProperty() 用于拦截对象的 Object.defineProperty() 操作

用于拦截对象的 Object.defineProperty() 操作。
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
接受三个参数

  1. 目标对象
  2. 操作的属性
  3. 相关属性的信息(可读,可写,可迭代,值)等
//具体使用如下
let obj = {}
Object.defineProperty(obj,"name":{
	value: "韩程远", //
  writable: false //禁止写
})

也就是说,用Object.defineProperty() 来操作 Proxy对象的时候触发 来看下列代码。

let obj = {
	name:"韩程远"
	age:18
}
let objProxy = new Proxy(obj,{
	defineProperty: function(target, key, descriptor) {
	console.log(target,key,descriptor)
    console.log('属性: ' + key);
    return true;
})
let heightDesc = { configurable: true, enumerable: true, value: 10 };
Object.defineProperty(objProxy,"height",heightDesc  ); 
// { name: '韩程远', age: 18 } height { value: 10, enumerable: true, configurable: true }
// 属性: height

在这里插入图片描述

isExtensible() 方法用于拦截对对象的 Object.isExtensible()

Object.isExtensible(): 方法判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。

let obj = {} // 对象默认是可以扩展的
Object.isExtensible(obj) // true
Object.preventExtensions(obj); // 把他扩展给禁用掉
Object.isExtensible(obj) // false  现在他不可以扩展了。

在这里插入图片描述

console.log(Object.isExtensible(objProxy)) //true

preventExtensions() 用于设置对Object.preventExtensions()的拦截

   preventExtensions(target){
        Object.preventExtensions(target);
        return true;
    }

在这里插入图片描述

handler.getOwnPropertyDescriptor() 方法是 Object.getOwnPropertyDescriptor() 的钩子。

Object.getOwnPropertyDescriptor() :

  1. Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。
  2. 自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性
const object1 = {
  property1: 42
};

const descriptor1 = Object.getOwnPropertyDescriptor(object1, 'property1');
console.log(descriptor1.value);

getOwnPropertyDescriptor 方法必须返回一个 object 或 undefined。

  1. 通过这个钩子给返回了一个对象
  2. .value 输出了值
    在这里插入图片描述
 getOwnPropertyDescriptor(target, key) {
        console.log("属性" + key)
        return { configurable: true, enumerable: true, value: 10 }
    }
    console.log(Object.getOwnPropertyDescriptor(objProxy, 'a').value);

handler.ownKeys()

Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。

可以拦截以下操作

  1. Object.getOwnPropertyNames()
  2. Object.getOwnPropertySymbols()
  3. Object.keys()
  4. Reflect.ownKeys()
ownKeys(target){
        return Reflect.ownKeys(target)
    }
console.log(Object.keys(objProxy))

在这里插入图片描述

handler.setPrototypeOf() 方法主要用来拦截 Object.setPrototypeOf().

Object.setPrototypeOf() 方法设置一个指定的对象的原型(即,内部 [[Prototype]] 属性)到另一个对象或 null。

接受两个参数:对象和原型

Object.setPrototypeOf(obj, prototype)

可以拦截下面的两个操作

  1. Object.setPrototypeOf()
  2. Reflect.setPrototypeOf()

在这里插入图片描述

 setPrototypeOf(target,newProto){
        console.log("target",target)
        console.log("newProto",newProto)
    }
    Reflect.setPrototypeOf(objProxy, newProto); 
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当然可以。JavaScript中的Proxy对象是ECMAScript 6中引入的一个新特性,它允许我们在访问一个对象之前,对这个对象进行拦截和修改。换句话说,Proxy对象是一个用于定义基本操作的对象,这些基本操作包括读取、写入、函数调用等。我们可以使用Proxy对象来创建一个拦截,来捕获并处理操作,比如对属性进行访问、设置、删除等。 Proxy对象有两个参数:target和handler。target是要拦截的目标对象,handler是一个对象,用于定义拦截目标对象的各种操作。handler中定义了各种拦截,用于拦截目标对象的不同操作,包括get、set、apply等。 以下是一个示例代码,说明如何使用Proxy对象: ``` let obj = { name: "John", age: 30 }; let handler = { get: function(target, prop) { if (prop === "age") { return target[prop] + " years old"; } else { return target[prop]; } }, set: function(target, prop, value) { if (prop === "age" && typeof value !== "number") { throw new TypeError("Age must be a number"); } else { target[prop] = value; } } }; let proxy = new Proxy(obj, handler); console.log(proxy.name); // Output: John console.log(proxy.age); // Output: 30 years old proxy.age = 35; console.log(proxy.age); // Output: 35 years old proxy.age = "35"; // Throws a TypeError: Age must be a number ``` 在这个例子中,我们定义了一个对象obj,然后创建了一个Proxy对象proxy,对obj对象进行拦截操作。handler对象中定义了get和set拦截,用于在读取和设置obj对象的属性时进行拦截和处理。 当我们使用proxy.name来获取name属性时,get拦截会被触发,它会返回obj对象中的name属性的值。而当我们使用proxy.age来获取age属性时,get拦截也会被触发,但是它返回的是一个字符串,即obj对象中age属性的值加上" years old"。 当我们使用proxy.age = 35来设置age属性时,set拦截会被触发,它会将35赋值给obj对象的age属性。而当我们使用proxy.age = "35"来设置age属性时,set拦截也会被触发,但是它会抛出一个类型错误,因为age属性必须是一个数字。 总的来说,Proxy对象为JavaScript中的对象操作提供了更加灵活的拦截和处理方式,它可以用于实现一些高级功能,比如数据绑定、权限控制等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值