前端 JS 经典:Proxy 和 DefineProperty

2024-05-14 00:36

本文主要是介绍前端 JS 经典:Proxy 和 DefineProperty,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:vue2 响应式原理 Object.defineProperty,vue3 响应式原理 Proxy 代理。本文主要讲这两个 api 的本质区别。

1. Proxy

Proxy 能够拦截和重新定义对象的基本操作,那什么叫对象的基本操作呢,对象内部运行的方法就是对象的基本操作。对象的内部操作有 11 种:[[GetPrototypeOf]]、[[SetPrototypeOf]]、[[IsExtensible]]、[[PreventExtensions]]、[[GetOwnProperty]]、[[DefineOwnProperty]]、[[HasProperty]]、[[GET]]、[[SET]]、[[DELETE]]、[[OwnPropertyKeys]]。如果是函数对象的话,会多两个基本操作:[[Construct]]、[[Call]]

如下对象操作实际上就是内部运行函数:

let obj = { name: "yqcoder" };Object.defineProperty(); // 实际上就是运行内部函数 [[DefineOwnProperty]]
obj.name; // 实际上就是运行内部函数 [[GET]]
obj.name = "YQcoder"; // 实际上就是运行内部函数 [[SET]]
delete obj.name; // 实际上就是运行内部函数 [[DELETE]]
// 实际上就是运行内部函数 [[OwnPropertyKeys]]
for (let key in obj) {
}

基本操作对应 property 的陷阱函数,什么叫陷阱函数,就是通过代理去读属性的时候,他本来应该是运行内部的[[GET]]基本操作的,但是最后走到了通过 Proxy 重新定义的 get() 函数了,没有运行内部的 [[GET]] 基本操作, 这就叫陷阱函数。

如下内部操作函数对应的陷阱函数:

[[GetOwnProperty]] => getPrototypeOf();
[[SetPrototypeOf]] => setPrototypeOf();
[[IsExtensible]] => isExtensible();
[[PreventExtensions]] => preventExtensions();
[[GetOwnProperty]] => getOwnPropertyDescriptor();
[[DefineOwnProperty]] => defineProperty();
[[HasProperty]] => has();
[[GET]] => get();
[[SET]] => set();
[[DELETE]] => deleteProperty();
[[OwnPropertyKeys]] => ownKeys()

2. DefineProperty

DefineProperty 本身就是个基本操作,他并不拦截基本操作,只是调用基本操作。所以在 vue2 中怎么处理数组的,因为拦截不到数组的 push、splice 等,直接重写了这些方法,改了原型,当这些数组去调方法的时候,实际是调用 vue2 重写的方法。

// vue2
Object.defineProperty(arr, "length", {set(value) {},get() {},
});// vue3
const p = new Proxy(arr, {get(target, prop) {},set(target, prop, value) {},
});

这篇关于前端 JS 经典:Proxy 和 DefineProperty的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/987257

相关文章

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

Vuex Actions多参数传递的解决方案

《VuexActions多参数传递的解决方案》在Vuex中,actions的设计默认只支持单个参数传递,这有时会限制我们的使用场景,下面我将详细介绍几种处理多参数传递的解决方案,从基础到高级,... 目录一、对象封装法(推荐)二、参数解构法三、柯里化函数法四、Payload 工厂函数五、TypeScript

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

详解nginx 中location和 proxy_pass的匹配规则

《详解nginx中location和proxy_pass的匹配规则》location是Nginx中用来匹配客户端请求URI的指令,决定如何处理特定路径的请求,它定义了请求的路由规则,后续的配置(如... 目录location 的作用语法示例:location /www.chinasem.cntestproxy

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化