js——proxy、Reflect中的receiver

news/2025/2/19 17:53:32/

proxy

一般情况

代码

let data={name:'张三',age:12
}
let proxyData=new Proxy(data,{get(target,key,receiver){console.log(target===data)console.log(receiver===proxyData)console.log(target===receiver)console.log(target,key,receiver)return target[key]},set(target,key,newVal,receiver){target[key]=newVal}
})
console.log(proxyData.name)

运行结果

PS C:\Users\Administrator\Desktop\简单测试\proxy的使用> node .\reflect.js
true
true
false
{ name: '张三', age: 12 } name { name: '张三', age: 12 }
张三

结论 

target===data

receiver===proxyData

发生继承情况

代码

const data = {sex:'男',name:'张三'
};
const obj = {name: '李四',
};
const proxyData = new Proxy(data, {get(target, key, receiver) {console.log(target===data)console.log(receiver===proxyData)console.log(receiver===obj)return target[key]},
});Object.setPrototypeOf(obj, proxyData);
console.log(proxyData.sex)
console.log(obj.sex)
console.log(obj.name)

运行结果

PS C:\Users\Administrator\Desktop\简单测试\proxy的使用> node .\proxy3.js
true
true
false
男
true
false
true
男
李四

结论

target===data

receiver===obj

有一个疑惑点

代码

const data = {sex:'男'
};
const obj = {name: '李四',
};
const proxyData = new Proxy(data, {get(target, key, receiver) {console.log(target)console.log(key)return target[key]},
});Object.setPrototypeOf(obj, proxyData);
console.log(obj)

运行结果

PS C:\Users\Administrator\Desktop\简单测试\proxy的使用> node .\proxy3.js
{ sex: '男' }
Symbol(nodejs.util.inspect.custom)
{ sex: '男' }
Symbol(Symbol.toStringTag)
{ name: '李四' }

上面的结果是为什么?知道的伙伴,可以留言解释一下

还有,如果一不小心写了

 get(target, key, receiver) {console.log(target)console.log(key)console.log(receiver)或console.log(obj)return target[key]},

会一直循环到报错

Reflect

不用Reflect方法

代码

const data = {sex:'男',get value(){return this.sex}
};
const obj = {sex:'女'
};
const proxyData = new Proxy(data, {get(target, key, receiver) {console.log(target)console.log(key)return target[key]},
});Object.setPrototypeOf(obj, proxyData);
console.log(proxyData.value)
console.log(obj.value)

运行结果

PS C:\Users\Administrator\Desktop\简单测试\proxy的使用> node .\proxy3.js
{ sex: '男', value: [Getter] }
value
男
{ sex: '男', value: [Getter] }
value
男

分析

obj没有value属性,所以obj会通过proxyData去访问data中value属性

target[value]===data[value]===[Getter]===value(){return this.sex}

但是this的指向谁?this默认指向data。

怎么更改this的指向,见下

使用Reflect方法

代码1

const data = {sex:'男',get value(){return this.sex}
};
const obj = {sex:'女'
};
const proxyData = new Proxy(data, {get(target, key, receiver) {console.log(target)console.log(key)return Reflect.get(target,key,receiver)},
});Object.setPrototypeOf(obj, proxyData);
console.log(proxyData.value)
console.log('----')
console.log(obj.value)

运行结果1

PS C:\Users\Administrator\Desktop\简单测试\proxy的使用> node .\proxy3.js
//访问proxyData.value
{ sex: '男', value: [Getter] } //console.log(target)
value                          //console.log(key)//通过Reflect.get(target,key,receiver)访问data.value
//此时的 value(){return receiver.sex} 并且receiver===proxyData 
//访问proxyData.sex 
{ sex: '男', value: [Getter] } 
sex
男----
{ sex: '男', value: [Getter] }
value
女

代码2

const data = {sex:'男',get value(){return this.sex}
};
const obj = {sex:'女'
};
const proxyData = new Proxy(data, {get(target, key, receiver) {console.log(target)console.log(key)return Reflect.get(target,key,{sex:'不确定'})},
});Object.setPrototypeOf(obj, proxyData);
console.log(proxyData.value)
console.log('----')
console.log(obj.value)

运行结果2

PS C:\Users\Administrator\Desktop\简单测试\proxy的使用> node .\proxy3.js
{ sex: '男', value: [Getter] }
value
不确定
----
{ sex: '男', value: [Getter] }
value
不确定


http://www.ppmy.cn/news/35823.html

相关文章

Baumer工业相机中偏振相机如何使用Baumer堡盟GAPI SDK来进行偏振数据的计算转换输出(C++)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具…

react组件进阶(四)

文章目录1. 组件通讯介绍2. 组件的 props3. 组件通讯的三种方式3.1 父组件传递数据给子组件3.2 子组件传递数据给父组件3.3 兄弟组件4. Context5. props 深入5.1 children 属性5.2 props 校验5.3 props 的默认值6. 组件的生命周期6.1 组件的生命周期概述6.2 生命周期的三个阶段…

C++ 标准模板库-vector

文章目录1. 概念2. Construct(构造)3. destructor(析构)4. operator(重载符号)5. Capacity:6. 参考文献1. 概念 vector是一个序列化容器,相当于可以改变大小的数组。 2. Construct&#xff08…

SpringMVC的响应处理

文章目录一、传统同步业务数据响应1. 请求资源转发2. 请求资源重定向3. 响应模型数据4. 直接回写数据二、前后端分离异步业务数据响应一、传统同步业务数据响应 Spring响应数据给客户端,主要分为两大部分: ⚫ 传统同步方式:准备好模型数据&am…

mysql 8.0集群搭建(一主多从和多主多从)

MYSQL8.0集群搭建 一主多从 基础环境**1. 下载 mysql rpm包****2.主节点添加主从同步账户****3.开启二进制日志文件和添加server-id**4.登入主节点mysql重置偏移量5.注册从节点6.启动 启动所有从节点的slave7.多主多从模式,(此模式基于上边一主多重模式搭…

为什么说学人工智能一定要学Python?

学习人工智能需要掌握大量的数据处理和算法实现,而Python作为一种高级编程语言,具有简单易学、灵活多变、开源丰富的库等优点,成为了人工智能领域广泛应用的语言之一。 具体来说,Python在人工智能中的优势包括: ​​…

nginx配合vite开启gzip压缩以及各种问题处理

1、导入压缩插件 import compressPlugin from "vite-plugin-compression";2、vite配置压缩插件 plugins: [vue(),compressPlugin({verbose: true, // 默认即可disable: false, //开启压缩(不禁用),默认即可deleteOriginFile: true, //删除源文件thresho…

黑马程序员 linux 学习笔记入门部分合集

ubuntu 安装 本课程使用 ubuntu 系统。 ubuntu 官网 - download。 上面会显示有两个版本,每年 ubuntu 发布两个版本,LTS 是长期维护版,所以相对会较稳定。 介绍 Linux 发行版本 不管什么版本,内核都是一样的。 RPM based&a…