返回顶部
首页 > 资讯 > 前端开发 > VUE >ES6中的Proxy有什么用
  • 277
分享到

ES6中的Proxy有什么用

2024-04-02 19:04:59 277人浏览 独家记忆
摘要

这篇文章主要介绍了es6中的Proxy有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 创建一个简单的Pr

这篇文章主要介绍了es6中的Proxy有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

创建一个简单的Proxy

let target = {}
let proxy = new Proxy(target, {})

proxy.name = 'proxy'

console.log(proxy.name) // proxy
console.log(target.name) // proxy

target.name = 'target'

console.log(proxy.name) // target
console.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 = 1
console.log(proxy.count) //1
console.log(target.count) //1

proxy.name = "proxy"

console.log(proxy.name) //proxy
console.log(target.name) //proxy

proxy.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) //proxy

console.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) // false
console.log("name" in proxy) // true
console.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) // true

let result1 = delete proxy.value

console.log(result1) // false
console.log("value" in proxy) // true

console.log("name" in proxy) // true

let result2 = delete proxy.name
console.log(result2) // true
console.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) //true
console.log(proxyProto === Object.prototype) // false
console.log(proxyProto) // null

Object.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) //true
console.log(proxyProto === Object.prototype) // true

Object.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) //proxy

let 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) // 1
console.log(names) // name

console.log(keys.length) //1
console.log(keys[0]) // name

console.log(symbols.length) //1
console.log(symbols[0]) // symbol(name)

感谢你能够认真阅读完这篇文章,希望小编分享的“ES6中的Proxy有什么用”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网VUE频道,更多相关知识等着你来学习!

--结束END--

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

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

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

猜你喜欢
  • ES6中的Proxy有什么用
    这篇文章主要介绍了ES6中的Proxy有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 创建一个简单的Pr...
    99+
    2024-04-02
  • ES6中Proxy有什么用
    这篇文章主要为大家展示了“ES6中Proxy有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ES6中Proxy有什么用”这篇文章吧。具体如下:Proxy ...
    99+
    2024-04-02
  • ES6中Proxy的作用是什么
    这篇文章主要介绍“ES6中Proxy的作用是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ES6中Proxy的作用是什么”文章能帮助大家解决问题。创建一个简单的Proxylet tar...
    99+
    2023-06-17
  • ES6中Proxy使用场景有哪些
    小编给大家分享一下ES6中Proxy使用场景有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!ES6 中的箭头函数、数组解构、...
    99+
    2024-04-02
  • es6中的proxy如何使用
    本篇内容主要讲解“es6中的proxy如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“es6中的proxy如何使用”吧! 在e...
    99+
    2024-04-02
  • JS中ES6代理Proxy怎么用
    这篇文章主要为大家展示了“JS中ES6代理Proxy怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS中ES6代理Proxy怎么用”这篇文章吧。proxy...
    99+
    2024-04-02
  • Ext.js中Proxy有什么用
    这篇文章将为大家详细讲解有关Ext.js中Proxy有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一:描述Proxy被Store用来加载和保存数据。Proxy的类型主要分为两大种客户端代理和服务端...
    99+
    2023-06-04
  • ES6中的Proxy类如何使用
    这篇文章主要介绍了ES6中的Proxy类如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇ES6中的Proxy类如何使用文章都会有所收获,下面我们一起来看看吧。Object在 ES5 中,我们可以定义一个对...
    99+
    2023-07-06
  • MySQL-Proxy有什么用
    这篇文章主要为大家展示了“MySQL-Proxy有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL-Proxy有什么用”这篇文章吧。MySQL-P...
    99+
    2024-04-02
  • es6中的some有什么用
    本篇内容介绍了“es6中的some有什么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在es6中,some的作用是检测数组中是否存在指定条...
    99+
    2023-06-29
  • ES6中Proxy与Reflect怎么实现重载
    这篇文章主要介绍“ES6中Proxy与Reflect怎么实现重载”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ES6中Proxy与Reflect怎么实现重载”文章能帮助大家解决问题。Proxy与Re...
    99+
    2023-06-17
  • es6中的反引号有什么用
    这篇文章给大家分享的是有关es6中的反引号有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 es6中的反引号的作用:1、用于解析变量,语法为“`...
    99+
    2024-04-02
  • es6的class有什么用
    这篇文章主要介绍了es6的class有什么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇es6的class有什么用文章都会有所收获,下面我们一起来看看吧。es6的class关键字用于快速地定义“类”;clas...
    99+
    2023-07-04
  • Es6 中Generator函数有什么用
    本篇文章给大家分享的是有关Es6 中Generator函数有什么用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。ECMAScript 6 (简...
    99+
    2024-04-02
  • es6中map()方法有什么用
    这篇文章将为大家详细讲解有关es6中map()方法有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 在es6中,map()方法用于对数组...
    99+
    2024-04-02
  • ES6中Array.of()方法有什么用
    这篇文章主要为大家展示了“ES6中Array.of()方法有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ES6中Array.of()方法有什么用”这篇文...
    99+
    2024-04-02
  • ES6中Array.from()方法有什么用
    小编给大家分享一下ES6中Array.from()方法有什么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Array.from()Array.from方法用于将两类对象转为真正的数组:类...
    99+
    2024-04-02
  • ES6中Class和Module有什么用
    小编给大家分享一下ES6中Class和Module有什么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、ClassES6引入了Class(类)这个概念,作为对象的模板。通过class关...
    99+
    2024-04-02
  • es6中Async函数有什么用
    这篇文章将为大家详细讲解有关es6中Async函数有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。async 函数async 函数,使得异步操作变得更加方便。它是 ...
    99+
    2024-04-02
  • Zabbix中的Proxy是什么
    Zabbix中的Proxy是一种中间代理服务器,用于收集监控数据并将其发送到主Zabbix服务器。Proxy可以帮助分担主Zabbi...
    99+
    2024-03-13
    Zabbix
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作