iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >ES6中Proxy的作用是什么
  • 787
分享到

ES6中Proxy的作用是什么

2023-06-17 09:06:58 787人浏览 薄情痞子
摘要

这篇文章主要介绍“es6中Proxy的作用是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ES6中Proxy的作用是什么”文章能帮助大家解决问题。创建一个简单的Proxylet tar

这篇文章主要介绍“es6中Proxy的作用是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ES6中Proxy的作用是什么”文章能帮助大家解决问题。

创建一个简单的Proxy

let target = {}let proxy = new Proxy(target, {})proxy.name = 'proxy'console.log(proxy.name) // proxyconsole.log(target.name) // proxytarget.name = 'target'console.log(proxy.name) // targetconsole.log(target.name) // target

这个实例将"proxy"赋值给proxy.name属性时会在目标上创建name,代理只是简单的将操作转发给目标,他不会储存这个属性。相当于proxy.name和target.name引用的都是target.name的值。

使用set陷阱验证属性

set陷阱接收四个参数:

1.trapTarget:用于接收属性(代理的目标)的对象

2.key:要写入的属性键(字符串或者symbol)

3.value:被写入的属性值

4.receiver:操作发生的对象(通常是代理)

let target = {    name: "target"}let proxy = new Proxy(target, {    set(trapTarget, key, value, receiver) {        if (!trapTarget.hasOwnProperty(key)) {            if (isNaN(value)) {                throw new TypeError("属性必须时数字")            }        }        return Reflect.set(trapTarget, key, value, receiver)    }})proxy.count = 1console.log(proxy.count) //1console.log(target.count) //1proxy.name = "proxy"console.log(proxy.name) //proxyconsole.log(target.name) //proxyproxy.other = "other" // 这里会报错因为不数字

这个实例每次在外面改变proxy的值时就会出发set函数。

用get陷阱验证对象结构

get接收3个参数

1.trapTarget:用于接收属性(代理的目标)的对象

2.key:要写入的属性键(字符串或者symbol)

3.receiver:操作发生的对象(通常是代理)

let proxy = new Proxy({}, {    get(trapTarget, key, receiver) {        if (!(key in receiver)) {            throw new TypeError("属性" + key + "不存在")        }        return Reflect.get(trapTarget, key, receiver)    }})proxy.name = "proxy"console.log(proxy.name) //proxyconsole.log(proxy.age) // 属性不存在会抛出错误

当我们访问proxy创建的对象属性时就会触发get方法

使用has陷阱因此已有属性

has接收2个参数:

1.trapTarget:用于接收属性(代理的目标)的对象

2.key:要写入的属性键(字符串或者symbol)

let target = {    name: "target",    value: 42}let proxy = new Proxy(target, {    has(trapTarget, key) {        if (key === 'value') {            return false        } else {            return Reflect.has(trapTarget, key)        }    }})console.log("value" in proxy) // falseconsole.log("name" in proxy) // trueconsole.log("toString" in proxy) // true

用deleteProperty陷阱防止删除属性

deleteProperty接收2个参数:

1.trapTarget:用于接收属性(代理的目标)的对象

2.key:要写入的属性键(字符串或者symbol)

let target = {    name: "target",    value: 42}let proxy = new Proxy(traget, {    deleteProperty(trapTarget, key) {        if (key === "value") {            return false        } else {            return Reflect.deleteProperty(trapTarget, key)        }    }})console.log("value" in proxy) // truelet result1 = delete proxy.valueconsole.log(result1) // falseconsole.log("value" in proxy) // trueconsole.log("name" in proxy) // truelet result2 = delete proxy.nameconsole.log(result2) // trueconsole.log("name" in proxy) // false

当外部要删除proxy的属性就会触发deleteProperty函数

原型代理陷阱(setProptotypeOf,getPrototypeOf)

setProptotypeOf接收2个参数

1.trapTarget:用于接收属性(代理的目标)的对象

2.proto:作为原型使用的对象

let target = {}let proxy = new Proxy(target, {    // 访问时调用    getPrototypeOf(trapTarget) {        return null    },    // 改变时调用    setPrototypeOf(trapTarget, proto) {        return false    }})let targetProto = Object.getPrototypeOf(target)let proxyProto = Object.getPrototypeOf(proxy)console.log(targetProto === Object.prototype) //trueconsole.log(proxyProto === Object.prototype) // falseconsole.log(proxyProto) // nullObject.setPrototypeOf(target, {}) // 成功Object.setPrototypeOf(proxy, {}) // 抛出错误

如果正常实现

let target = {}let proxy = new Proxy(target, {    // 访问时调用    getPrototypeOf(trapTarget) {        return Reflect.getPrototypeOf(trapTarget)    },    // 改变时调用    setPrototypeOf(trapTarget, proto) {        return Reflect.setPrototypeOf(trapTarget, proto)    }})let targetProto = Object.getPrototypeOf(target)let proxyProto = Object.getPrototypeOf(proxy)console.log(targetProto === Object.prototype) //trueconsole.log(proxyProto === Object.prototype) // trueObject.setPrototypeOf(target, {}) // 成功Object.setPrototypeOf(proxy, {}) // 成功

属性描述符陷阱

defineProperty接收三个参数:

1.trapTarget:用于接收属性(代理的目标)的对象

2.key:要写入的属性键(字符串或者symbol)

3.descriptor:属性的描述对象

let proxy = new Proxy({}, {    defineProperty(trapTarget, key, descriptor) { // descriptor 只能接收enumerable, configurable, value, writeable, get, set         if (typeof key === "symbol") {            return false        }        return Reflect.defineProperty(trapTarget, key, descriptor)    },    getOwnPropertyDescriptor(trapTarget, key) {        return Reflect.getOwnPropertyDescriptor(trapTarget, key)    }})Object.defineProperty(proxy, "name", {    value: "proxy"})console.log(proxy.name) //proxylet nameSymbol = Symbol("name")Object.defineProperty(proxy, nameSymbol, {    value: "proxy"})

在外部调用defineProperty | getOwnPropertyDescriptor时会触发内部definenProperty | getOwnPropertyDescriptor方法。

ownKeys陷阱

ownKeys陷阱会拦截外部的Object.keys(),Object.getOwnPropertyName(),Object.getOwnPropertySymbols()和Object.assign()四个方法

let proxy = new Proxy({}, {    ownKeys(trapTarget) {        return Reflect.ownKeys(trapTarget).filter(key => {            return typeof key !== "string" || key[0] !== '_'        })    }})let nameSymbol = Symbol("name")proxy.name = "proxy"proxy._name = "private"proxy[nameSymbol] = "symbol"let names = Object.getOwnPropertyNames(proxy),    keys = Object.keys(proxy),    symbols = Object.getOwnPropertySymbols(proxy)console.log(names.length) // 1console.log(names) // nameconsole.log(keys.length) //1console.log(keys[0]) // nameconsole.log(symbols.length) //1console.log(symbols[0]) // symbol(name)

关于“ES6中Proxy的作用是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: ES6中Proxy的作用是什么

本文链接: https://www.lsjlt.com/news/288162.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ES6中Proxy的作用是什么
    这篇文章主要介绍“ES6中Proxy的作用是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ES6中Proxy的作用是什么”文章能帮助大家解决问题。创建一个简单的Proxylet tar...
    99+
    2023-06-17
  • ES6中的Proxy有什么用
    这篇文章主要介绍了ES6中的Proxy有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 创建一个简单的Pr...
    99+
    2022-10-19
  • ES6中Proxy有什么用
    这篇文章主要为大家展示了“ES6中Proxy有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ES6中Proxy有什么用”这篇文章吧。具体如下:Proxy ...
    99+
    2022-10-19
  • es6中的proxy如何使用
    本篇内容主要讲解“es6中的proxy如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“es6中的proxy如何使用”吧! 在e...
    99+
    2022-10-19
  • JS中ES6代理Proxy怎么用
    这篇文章主要为大家展示了“JS中ES6代理Proxy怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS中ES6代理Proxy怎么用”这篇文章吧。proxy...
    99+
    2022-10-19
  • ES6中的Proxy类如何使用
    这篇文章主要介绍了ES6中的Proxy类如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇ES6中的Proxy类如何使用文章都会有所收获,下面我们一起来看看吧。Object在 ES5 中,我们可以定义一个对...
    99+
    2023-07-06
  • es6中引入的作用域是什么
    本文小编为大家详细介绍“es6中引入的作用域是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“es6中引入的作用域是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
    99+
    2022-10-19
  • es6装饰器的作用是什么
    这篇文章主要介绍“es6装饰器的作用是什么”,在日常操作中,相信很多人在es6装饰器的作用是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”es6装饰器的作用是什么”的疑惑...
    99+
    2022-10-19
  • es6修饰器的作用是什么
    这篇文章主要讲解了“es6修饰器的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“es6修饰器的作用是什么”吧!在es6中,修饰器用来注释或修改类和类的方法,依赖于ES5的“Obje...
    99+
    2023-07-05
  • mysql中proxy是什么意思
    小编给大家分享一下mysql中proxy是什么意思,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!mysql proxy是mysql官方提供的mysql中间件服务,上游可接入若干个【mysql-...
    99+
    2022-10-18
  • es6解构赋值的作用是什么
    本文小编为大家详细介绍“es6解构赋值的作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“es6解构赋值的作用是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
    99+
    2022-10-19
  • es6中promise是什么及有哪些作用
    这篇文章主要讲解了“es6中promise是什么及有哪些作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“es6中promise是什么及有哪些作用”吧! ...
    99+
    2022-10-19
  • Ext.js中Proxy有什么用
    这篇文章将为大家详细讲解有关Ext.js中Proxy有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一:描述Proxy被Store用来加载和保存数据。Proxy的类型主要分为两大种客户端代理和服务端...
    99+
    2023-06-04
  • proxy服务器指的是什么
    这篇文章主要介绍proxy服务器指的是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!代理服务器(Proxy Server)是指作为客户端和资源提供商或服务器之间中间件的物理机或者应用程序。代理服务器是网络信息的中...
    99+
    2023-06-14
  • es6中let指的是什么
    这篇文章主要介绍“es6中let指的是什么”,在日常操作中,相信很多人在es6中let指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”es6中let指的是什么”的疑惑...
    99+
    2022-10-19
  • es6中symbol指的是什么
    这篇文章主要介绍es6中symbol指的是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! es6中的symbol是一种新的原始数据类型,用于表示独一无...
    99+
    2022-10-19
  • es6中=>指的是什么
    本篇内容主要讲解“es6中=>指的是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“es6中=>指的是什么”吧! es...
    99+
    2022-10-19
  • ES6中class的基础用法是什么
    这篇“ES6中class的基础用法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ES...
    99+
    2022-10-19
  • es6中includes返回的是什么
    本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。includes() 方法用于判断字符串/数组是否包含指定的值;会返回一个布尔值,表示字符串/数组是否包含给定的值。语法:ojb.includes(sea...
    99+
    2023-05-14
    javascript ES6
  • es6的常用语法是什么
    这篇文章主要介绍“es6的常用语法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“es6的常用语法是什么”文章能帮助大家解决问题。最常用的ES6特性let, const这两个的用途与var类似,...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作