学习ts(十二)Proxy与Reflect

定义

Proxy

  • 为开发者提供了拦截并向基本操作嵌入额外行为的能力。具体的说,可以给目标对象定义一个关联的代理对象,而这个代理对象可以作为抽象的目标对象来使用。在对目标对象的各种操作影响目标对象之前,可以在代理对象中对这些操作加以控制。
  • 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于中“元编程”,即对编程语言进行编译。可以理解成在目标对象前架设一个“拦截”层,外界对该对象的访问都必须先通过这层拦截。
  • 通过调用new Prosy(),你可以创建一个代理用来替代另一个对象,这个代理对目标对象进行了虚拟,因此该代理与该目标对象表面上可以被当做同一个对象来对待。

关键词

  • 创建:代理对象是一个新对象
  • 其他对象:只能代理对象

Reflect

  • 将object对象的一些明显属于语言内部的方法(比如:Object.defineProperty)放到Reflect上。现阶段,某些方法同时在Object和Reflect上部署,未来的新方法只会在Reflect上部署。从Reflect可以拿到语言内部的方法。
  • 修改某些方法的返回值,让其变得合理
  • Reflect对象的方法与Proxy对象的方法一一对应

方法

Reflect.get(target,name,receiver)
查找并返回targetname属性,没有则返回undefined

Reflect.set(target,name,value,receiver)
对象属性的设置,返回一个布尔值

Reflect.has(target,propKey)
propKey in proxy 操作,返回一个boolean值

Reflect.deleteProperty(target,name)
等同于delete obj[name],用于删除对象属性

Reflect.construct(target,args)
等同于new target(...args),这提供了一种不使用new来调用构造函数的方法

Reflect.getPrototypeOf(target)
用于读取对象的__proto__属性,对应Object.getPrototypeOf(obj)

Reflect.setPrototypeOf(target,prototype)
用于设置目标对象的原型(prototype),对应Object.setPrototypeOf(obj,newProto)方法,返回一个boolean值,表示是否设置成功

Reflect.apply(target,thisArg,args)
等同于Function.prototype.apply.call(func,thisArg,args),用于绑定this对象后执行给定函数

Reflect.defineProperty(target,name,desc)
方法基本等同于Object,defineProperty,用来为对象定义属性,未来,后者会被逐渐替代

Reflect.getOwnPropertyDescriptor(target,name)
基本等同于Object.getOwnPropertyDescriptor,用于得到指定属性的描述对象,将来会替代掉后者

Reflect.isExtensible
对应Object.isExtensible,返回一个布尔值,表示当前对象是否可扩展。

Reflect.preventExtensions
对应Object.preventExtensions方法,用于让一个对象变为不可扩展。它返回一个布尔值,表示是否操作成功。

Reflect.ownKeys
方法用于返回对象的所有属性,基本等同于Object.getOwnPropertyNamesObject.getOwnPropertySymbols之和

数组倒序访问

var arr = [1, 2, 3, 4]
var proxy = new Proxy(arr, {get(target, propKey, receiver) {let nPropKey = parseInt(propKey as string) //解析字符串,返回整数if (nPropKey < 0) {if (Math.abs(nPropKey) <= target.length) { // 返回绝对值return target[target.length + nPropKey]} else {return '访问越界'}}return Reflect.get(target, propKey, receiver)}
})
console.log(proxy[-2])
console.log(proxy[-20])

实现观察者模式

const queuedObserverList:Set<Function> = new Set()
const observe = (fn:Function) => {queuedObserverList.add(fn)
}
const observable = (obj) => new Proxy(obj, {set(target, key, value, receiver) {queuedObserverList.forEach((fun) => fun())return Reflect.set(target, key, value, receiver)}
})const person = observable({ name: 'hello', age: 11 })
function print() {console.log(`${person.name}--${person.age}`)
}
observe(print)
person.name = 'hi'

keyof优化

module A {type Person = {name: string,age: number,sex: number}const proxy = (object: any, key: any) => {return new Proxy(object, {get(target, prop, receiver) {console.log('get')return Reflect.get(target, prop, receiver)},set(target, prop, value, receiver) {console.log('set')return Reflect.set(target, prop, value, receiver)}})}// const logAccess = (object: Person, key: 'name' | 'age' | 'sex') => {//     return proxy(object, key)// }const logAccess = <T>(object: T, key: keyof T) => {return proxy(object, key)}let woman: Person = logAccess({name: 'orange',sex: 0,age: 18}, 'age')woman.age = 16console.log(woman)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/59836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打架斗殴行为识别算法

打架斗殴行为识别算法通过yolov7网络模型深度学习算法&#xff0c;打架斗殴行为识别算法对提取到的信息进行分析和比对&#xff0c;判断是否存在打架斗殴行为。打架斗殴行为识别算法一旦打架斗殴行为识别算法识别到打架斗殴行为&#xff0c;系统会立即生成预警信息&#xff0c;…

SQLyog问题处理集合

sqlyog 问题处理 1. 错误号码:1049错误&#xff1a; 数据库命令参数参考&#xff1a;数据库命令地址 检查数据库是否存在检查创建的数据库名称 与 要进行连接的数据库名称是否一致&#xff1b; 2. 错误号码:1819错误&#xff1a; MySQL授予远程连接权限时出现&#xff1a; …

数据采集:selenium 提取 Cookie 自动登陆

写在前面 工作需要&#xff0c;简单整理博文内容涉及 通过 selenium 实现自动登陆理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#x…

Android JNI系列详解之CMake编译工具的使用

一、CMake工具的介绍 如图所示&#xff0c;CMake工具的主要作用是&#xff0c;将C/C编写的native源文件编译打包生成库文件&#xff08;包含动态库或者静态库文件&#xff09;&#xff0c;集成到Android中使用。 二、CMake编译工具的使用 使用主要是配置两个文件&#xff1a;CM…

Ansible学习笔记12

playbook&#xff1a; playbook&#xff08;剧本&#xff09;&#xff1a;是ansible用于配置、部署和管理被控节点的剧本&#xff0c;用于Ansible操作的编排。 使用的是yaml格式&#xff0c;&#xff08;saltstack、elk、docker、docker-compose、k8s都会使用到yaml格式。&am…

快速入门学习记录:常用代码、特定函数、复杂概念和特定功能说明

&#x1f600;前言 本篇博文是关于Java入门学习的一些常用记录&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&a…

js对url进行编码解码(三种方式)

第一种&#xff1a;escape 和 unescape escape()不能直接用于URL编码&#xff0c;它的真正作用是返回一个字符的Unicode编码值 它的具体规则是&#xff0c;除了ASCII字母、数字、标点符号" * _ - . /"以外&#xff0c;对其他所有字符进行编码。在u0000到u00ff之间…

【模拟】算法实战

文章目录 一、算法原理二、算法实战1. leetcode1576 替换所有的问号2. leetcode495 提莫攻击3. leetcode6 N字形变换4. leetcode38 外观数列5. leetcode1419 数青蛙 三、总结 一、算法原理 模拟就是用计算机来模拟题目中要求的操作&#xff0c;模拟题目通常具有代码量大、操作…

Java稀疏数组

目录 1.稀疏数组 2.稀疏数组的使用 2.1 二维数组转换为稀疏数组 2.2 稀疏数组转换为二维数组 1.稀疏数组 稀疏数组&#xff08;Sparse Array&#xff09;&#xff1a;当一个数组中的大部分元素为相同的值&#xff0c;可使用稀疏数组来保存该数组&#xff0c;可以将稀疏数组…

记录--怎么实现一个3d翻书效果

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 本篇主要讨论以下两种翻书动画的实现&#xff1a; 第一种是整页翻转的效果&#xff1a; 这种整页翻转的效果主要是做rotateY的动画&#xff0c;并结合一些CSS的3d属性实现。 第二种折线翻转的效果&…

MATLAB不显示figure绘图窗口但保存图像的方案

MATLAB不显示figure绘图窗口但保存图像的方案&#xff0c;代码如下&#xff1a; % 生成数据 x linspace(0, 2*pi, 100); y1 sin(x); y2 cos(x); y3 sin(2*x);% 创建不可见的 Figure fig1 figure(Visible, off); plot(x, y1); title(Sine Curve); xlabel(X); ylabel(Y); s…

本文将介绍PHP中的数据类型

引言 在PHP中&#xff0c;与所有编程语言一样&#xff0c;数据类型用于对特定类型的数据进行分类。这一点很重要&#xff0c;因为你使用的特定数据类型将决定你可以给它赋什么值&#xff0c;可以对它做什么操作(包括可以对它执行什么操作)。 在本教程中&#xff0c;我们将介绍…

北京筑龙受邀出席中物联“采购供应链中国行—走进雄安”活动

日前&#xff0c;“采购供应链中国行—走进雄安”活动在河北雄安新区成功举办&#xff0c;来自30家相关单位的50余名领导和代表参加了本次活动。活动由中国物流与采购联合会公共采购分会主办&#xff0c;中国物流与采购联合会采购委、中国雄安集团有限公司、河北雄安新区招标投…

【数据结构】二叉数的存储与基本操作的实现

文章目录 &#x1f340;二叉树的存储&#x1f333;二叉树的基本操作&#x1f431;‍&#x1f464;二叉树的创建&#x1f431;‍&#x1f453;二叉树的遍历&#x1f3a1;前中后序遍历&#x1f4cc;前序遍历&#x1f4cc;中序遍历&#x1f4cc;后续遍历 &#x1f6eb;层序遍历&am…

Java 8:Stream API 流式操作(学习)

Java 8&#xff1a;Stream API Java 8 中的 Stream API 是一组用于对集合数据进行处理的新特性&#xff1b;提供一种以声明式风格对集合进行操作的方式&#xff0c;简化集合的处理&#xff0c;使得代码更加简洁、优雅&#xff0c;并且能够更高效地处理数据&#xff1b; 这种风格…

商家必读:影响快递物流速度的这几个关键因素

在这个迅速发展的数字时代&#xff0c;消费者对于快速、高效的购物体验有着越来越高的期望。而作为商家&#xff0c;能否满足顾客对快递速度的要求将直接影响到商家的竞争力和业务发展。今天就和大家聊聊一个在电商行业中至关重要的话题——快递的物流速度对商家的重要性。 首…

leetcode做题笔记108. 将有序数组转换为二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 思路一&#xff1a;模拟题意 struct TreeNode* inorder(int…

Linux——socket网络通信

一、什么是socket Socket套接字 由远景研究规划局&#xff08;Advanced Research Projects Agency, ARPA&#xff09;资助加里福尼亚大学伯克利分校的一个研究组研发。其目的是将 TCP/IP 协议相关软件移植到UNIX类系统中。设计者开发了一个接口&#xff0c;以便应用程序能简单地…

LeetCode 面试题 01.08. 零矩阵

文章目录 一、题目二、C# 题解 一、题目 编写一种算法&#xff0c;若M N矩阵中某个元素为0&#xff0c;则将其所在的行与列清零。 点击此处跳转题目。 示例 1&#xff1a; 输入&#xff1a; [ [1,1,1], [1,0,1], [1,1,1] ] 输出&#xff1a; [ [1,0,1], [0,0,0], [1,0,1] ] 示…