关于ES6里的proxy()

本文详细介绍了JavaScript中的Proxy对象,它用于创建一个代理,实现对目标对象的访问拦截。Proxy有两个主要参数,一个是原始对象,另一个是处理方法,包含set和get等方法。set方法可以用来过滤和验证赋值操作,get方法则在访问属性时自动调用。通过这两个方法,可以实现数据访问的拦截和自定义行为,例如数据验证、日志记录等。Proxy在前端开发中常用于数据绑定、对象观测等场景。

proxy()

作用: 进行预处理,也可以说是在修改某些默认的行为,并且做出一层拦截,所有的访问都必须通过这层拦截,因此出了一种机制,可以对外界的访问进行修改
他有两个参数,参数1 :被处理的对象 参数2: 处理的{}的方法
例子:

var b = new Proxy(obj,{
			set(){
			},
			get(){
			}
		})
				

set()方法:

作用:可以做过滤
他有三个参数: 参数1 原对象 var =obj{‘name’:“zhangsan”,age:18,img:‘1.png’};
参数2 调用的属性名 age; 参数3 你传入的属性值 19
例子:

var obj = {'name':"zhangsan",age:18,img:'1.png'};
        var b = new Proxy(obj,{
            set(target,key,value){
                // console.log(target[key]);
                var a = target[key].substring(0,1)
                if(value == a){
                    console.log('ok思密达')
                }else{
                    console.log('get out')
                } 
            })
b.age = 18 //当你调用里面的属性并且赋值的时候,会自动调用set方法

get()方法:

作用: 当你访问里面的属性是出自动调用此方法;
他有两个参数:参数1 原对象 参数2 访问的属性名
例子:

bb = new Proxy(test, {  
                get(target, key) {
                    // target[key] = target[key]+"哈哈"
                    for(let i in target){
                        target[i] = target[i]+"嘿嘿嘿"
                    }
                    return target        
            }
        });
        bb.oo
        console.log(bb)

总结: proxy()就是代理,在外界进行为访问时做出一层拦截,他有两个参数,参数一是原对象,参数二是方法 ,他里面有两个方法分别是set()和get()方法

### Proxy 的基本用法和功能 ProxyES6 引入的一个功能强大的对象,用于对目标对象的操作进行拦截和自定义处理。通过 Proxy,可以对对象的读取、赋值、函数调用等操作进行拦截,并在操作前后执行自定义逻辑。Proxy 的基本语法如下: ```javascript const proxy = new Proxy(target, handler); ``` - `target` 是目标对象。 - `handler` 是一个对象,定义了拦截行为的方法。 #### 1. `get` 拦截属性读取 当访问对象的属性时,可以通过 `get` 方法拦截并自定义行为。例如,可以记录访问的属性或修改返回值。 ```javascript let star = { name: '我是小阳仔', age: 18 }; let proxy = new Proxy(star, { get(targetObj, property, receiver) { console.log(`访问的属性: ${property}`); return Reflect.get(targetObj, property, receiver); } }); console.log(proxy.name); // 输出: 访问的属性: name, 然后输出 "我是小阳仔" ``` #### 2. `set` 拦截属性赋值 `set` 方法可以拦截对对象属性的赋值操作,允许在赋值时进行验证或额外处理。 ```javascript let obj = { age: 20 }; let proxy = new Proxy(obj, { set(target, property, value, receiver) { if (property === 'age' && typeof value !== 'number') { throw new TypeError('年龄必须是数字'); } return Reflect.set(target, property, value, receiver); } }); proxy.age = 25; // 正确赋值 proxy.age = '三十'; // 抛出 TypeError ``` #### 3. `has` 拦截 `in` 运算符 `has` 方法可以拦截 `in` 运算符的使用,用于控制对象属性的存在性检查。 ```javascript let obj = { name: 'starry' }; let proxy = new Proxy(obj, { has(target, prop) { if (prop === 'secret') { return false; // 隐藏 secret 属性 } return Reflect.has(target, prop); } }); console.log('secret' in proxy); // 输出: false console.log('name' in proxy); // 输出: true ``` #### 4. `apply` 拦截函数调用 当 Proxy 代理一个函数时,可以通过 `apply` 方法拦截函数的调用。 ```javascript function sum(a, b) { return a + b; } let proxy = new Proxy(sum, { apply(target, thisArg, args) { console.log('函数被调用了'); return Reflect.apply(target, thisArg, args); } }); console.log(proxy(2, 3)); // 输出: 函数被调用了, 然后输出 5 ``` #### 5. `construct` 拦截构造函数调用 `construct` 方法可以拦截 `new` 操作符的使用,用于自定义构造函数的行为。 ```javascript class Person { constructor(name) { this.name = name; } } let proxy = new Proxy(Person, { construct(target, args, newTarget) { console.log('构造函数被调用'); return Reflect.construct(target, args, newTarget); } }); let person = new proxy('Alice'); // 输出: 构造函数被调用 console.log(person.name); // 输出: Alice ``` ### Proxy 的应用场景 Proxy 在实际开发中有多种应用场景,包括但不限于以下几种: - **数据绑定**:在框架中,Proxy 可以用于监听对象属性的变化,从而自动更新视图。 - **日志记录**:可以在访问或修改对象属性时记录日志。 - **数据验证**:在设置属性值时进行类型检查或其他验证逻辑。 - **隐藏属性**:通过 `has` 方法控制某些属性对 `in` 运算符不可见。 - **函数拦截**:拦截函数调用,添加额外的处理逻辑,如性能监控。 ### 示例:修改属性读取行为 以下示例展示了如何使用 Proxy 修改对象的 `message` 属性读取行为。 ```javascript let target = { message: 'Hello, world!' }; let handler = { get(target, prop, receiver) { if (prop === 'message') { return 'Modified message: ' + Reflect.get(target, prop, receiver); } return Reflect.get(target, prop, receiver); } }; let proxy = new Proxy(target, handler); console.log(proxy.message); // 输出: Modified message: Hello, world! ``` ### 总结 Proxy 提供了一种强大的机制,允许开发者对对象的操作进行细粒度的控制。通过拦截和自定义对象的行为,Proxy 可以用于实现数据绑定、日志记录、数据验证等多种功能。在实际应用中,Proxy 可以极大地增强代码的灵活性和可维护性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值