学习笔记 JavaScript ES6 Proxy

2023-11-12

学习内容:

  • 代理
  • 常用拦截方法

ES 5当中实现拦截的方法:

let obj = {}
let newValue = ''
Object.defineProperty(obj, 'name', {
    get() {
        return newValue
    },
    set(val) {
        console.log('set')
        newValue = val
    }
}) 
obj.name = 'test'
console.log(obj.name)

-------
set
test

ES6 Proxy

// 第一个参数是拦截或是要包装的对象或方法,
// 第二个参数是代理的配置,会对应一些钩子函数,
// 比如上面的get/set方法都可以称为钩子函数,
// 或者说在某些操作执行之前,要执行的函数称为钩子函数。
let obj = {}
let p = new Proxy(obj, {})
p.name = 'test'
console.log(obj.name);
for(let key in obj) {
    console.log(key);
}

----------
test
name
拦截器 作用
get 拦截对象属性的读取,比如proxy.name和proxy[name]
set 拦截对象属性的设置,返回一个布尔值,比如proxy.name=v或proxy['name'] = v
has 拦截propKey in proxy的操作,返回一个布尔值
ownKeys

拦截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、Object.keys(proxy)、

for...in循环,返回一个数组

deleteProperty 拦截delete proxy[propKey]的操作,返回一个布尔值
apply 拦截函数的调用、call和apply操作
construct 拦截new命令,返回一个对象

 

下面这个例子是对数组的代理,下标位置有值存在则返回对应的值,没有返回error:

let arr = [1, 2, 3]
arr = new Proxy(arr, {
    get(target, prop) {
        console.log(target, prop)
        return prop in target ? target[prop] : 'error'
    }
})

console.log(arr[1]);

---------------------
(3) [1, 2, 3] '1'
2

再来一个对象代理的例子:

let dict = {
    'Good' : '好',
    'morning' : '早上'
}

dict = new Proxy(dict, {
    get(target, prop) {
        return prop in target ? target[prop] : prop
    }
}) 

console.log(dict['Good'])
console.log(dict['haha']);

----------
Good
haha

拦截方式 : has()

let range = {
    start : 1,
    end : 5
}

range = new Proxy(range, {
    has(target, prop) {
        return prop >= target.start && prop <=target.end
    }
})

console.log(2 in range) 
console.log(10 in range)

--------
true
false

拦截方式:ownKeys 

对象的循环遍历时拦截

let userinfo = {
    username : 'Sure',
    age : 36,
    _password : '***'
}

userinfo = new Proxy(userinfo, {
    ownKeys(target) {
        return Object.keys(target).filter(key => !key.startsWith('_'))
    }
})

for(let key in userinfo) {
    console.log(key);
}

console.log(Object.keys(userinfo));
-----------
username
age
(2) ['username', 'age']

拦截方式deleteProperty() 

对象删除属性时拦截

let obj = {
    k : 'k',
    v : 'v',
    _p : '**'
}

obj = new Proxy(user, {
    deleteProperty(target, prop) {
        if(prop.startsWith('_') {
            throw new Error('不可删除')
        } else {
            delete target[prop]
            return true // 不要忘了返回boolean
        }
    }
})

拦截方式apply()

用于拦截函数、call、apply等

// 例子:对于参数不固定的求和
let sum = (...args) => {
    let num = 0
    args.forEach(item => {
        num += item
    })
    return num
}

sum = new Proxy(sum, {
    // 第一个参数,是被拦截对象,第二个参数是上下文,
    // 第三个参数是目标对象参数的数组
    apply(target, ctx, arg) {
        return target(...arg) * 2
    }
})
console.log(sum(1, 2));
console.log((sum.call(null, 1, 2, 3))) // 不需要改变this指向,所以第一个参数为null

//  apply后面的参数是数组
console.log(sum.apply(null, [1, 2, 3])) // 同样,不需要改变this指向,所以第一个参数为null

---------
6
12
12

 拦截方式construct()

用于拦截new()

let User = class {
    constructor(name) {
        this.name = name
    }
}
User = new Proxy(User, {

    // 这个拦截操作必需要返回一个对象
    construct(target, args, newTartget) {
        console.log('construct');
        return new target(...args)
    }
})

console.log(new User('test'));

--------------------
construct
User {name: 'test'}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习笔记 JavaScript ES6 Proxy 的相关文章

随机推荐

  • 下载JDK并配置JDK环境变量

    1 下载JDK8或者JDK11 1 点击链接进入官网下载页面 https www oracle com java technologies downloads java8 下拉页面一直到下载的地方 在这里可以选择是下载JDK8还是JDK11
  • 判断某个数组是否包含在另一个数组中

    判断b数组是否包含在a数组中 function isContained a b if a instanceof Array b instanceof Array return false if a length lt b length re
  • 打开cmd闪退

    我们在使用电脑过程中一般会很少用到cmd命令 CMD命令窗口在一些特殊情况时我们会用到 如PING下看网络通不通 在CMD窗口里运行命令如磁盘格式转换 但是有些朋友遇到了这样的问题 在开始运行输入CMD回车后 CMD命令黑框框出来闪一下就消
  • 使用“VMware ThinApp”绿化软件

    当我看到 WPS Office 在我的电脑中写入了上万条注册表项时 我几乎要崩溃了 这个 有点太多了吧 软件绿化工具 环境 Workstation 15 5 Player for Windows 绿化软件 VMware ThinApp 软件
  • 纹波电压

    什么是纹波电压 狭义上的纹波电压 是指输出直流电压中含有的工频交流成分 直流电压本来应该是一个固定的值 但是很多时候它是通过交流电压整流 滤波后得来的 由于滤波不彻底 就会有剩余的交流成分 下图为1 8V的纹波电压 纹波电压是如何产生的 首
  • 2022年Python笔试选择题及答案(秋招)

    2022年Python笔试选择题及答案 秋招 单选题 1 以下关于 Python 的描述错误的是 A Python 的语法类似 PHP B Python 可用于 Web 开发 C Python 是跨平台的 D Python 可用于数据抓取
  • 网络编程day7作业

    将词典导入数据库 include
  • Unity 空格会触发Button的问题

    问题 做了一个界面 空格可以召唤或者关闭一个面板 上面有Button可以控制人物数量信息 当点击过Button修改数量 再按下空格隐藏面板后 最后点击的Button就会被空格键触发一次 如下图 解决 这是由于Button中Navigatio
  • PAT乙级题解—— 1071 小赌怡情 (15分)

    常言道 小赌怡情 这是一个很简单的小游戏 首先由计算机给出第一个整数 然后玩家下注赌第二个整数将会比第一个数大还是小 玩家下注 t 个筹码后 计算机给出第二个数 若玩家猜对了 则系统奖励玩家 t 个筹码 否则扣除玩家 t 个筹码 注意 玩家
  • vue 组件生命周期钩子详解

    Vue是一个自带组件系统的前端框架 Vue的每一个实例其实就是一个组件 我们在组织我们的页面结构的时候其实就是在定一个一个组件 然后拼装在一起 完成一个复杂的页面逻辑 组件主要包含 数据 模版 以及链接数据和模版的状态响应系统 除了这些 我
  • Spark内存管理-UnifiedMemoryManager和StaticMemoryManager

    在Spark 1 6 0中 引入了一个新的参数spark memory userLegacyMode 默认值为false 表示不使用Spark 1 6 0之前的内存管理机制 而是使用1 6 0中引入的动态内存分配这一概念 从SparkEnv
  • 解决Git上传代码error: failed to push some refs to ‘xxx‘hint:(e.g., ‘git pull ...‘) before pushing again错误

    在使用git提交代码时会出现error failed to push some refs to xxxx的错误 如下图 hint Updates were rejected because the remote contains work
  • 使用Adivisor配置增强处理,来实现数据库读写分离

    一 先写一个demo来概述Adivisor的简单使用步骤 实现步骤 1 通过MethodBeforeAdivice接口实现前置增强处理 1 public class ServiceBeforeAdvisor implements Metho
  • 基础算法:前缀和

    前缀和 定义 s i 表示原数组前i个数的和 作用 求任意区间 l r 的和的时间复杂度从循环加的O n 到 s r s l 1 的时间复杂度O 1 eg s 3 a1 a2 a3 s 5 a1 a2 a3 a4 a5 s 4 5 s 5
  • 数字SOC设计之低功耗设计入门(二)——功耗的分析

    前面学习了进行低功耗的目的个功耗的构成 今天就来分享一下功耗的分析 由于是面向数字IC前端设计的学习 所以这里的功耗分析是基于DC中的power compiler工具 更精确的功耗分析可以采用PT 关于PT的功耗分析可以查阅其他资料 这里不
  • Bugku-game WP 一道有意思的题

    开启环境后 进入到了一个页面内的游戏界面 在页面中没有发现什么提示 开始游戏后 发现游戏内玩家通过玩游戏可以获得一定的积分 那么试想是否可以通过将积分更改得很大得做法来通关获得flag 查看源码 众所周知 分数一般会取名为score 那么在
  • Java Web应用开发常用网上资源

    前言 为了方便学习 下面为大家推荐一些学习Java Web开发的相关资源 使用这些资源 可以帮助你找到精通Java Web应用开发的捷径 常用资源下载网 在开发Java Web应用程序时 通常需要到相关资源的官方网站下载一些资源 下面将给出
  • jenkins如何同一jar包部署到多台服务器

    文章目录 安装插件 配置ssh服务 构建完成后执行 没有部署过可以跟这个下面的步骤先部署一遍 我这篇主要讲jenkins同一jar包部署到多台服务器 Jenkins 部署Springboot项目https blog csdn net qq
  • 步进电机五根线怎么接_软启动怎么接电机?软启动电机实物接线图

    电工学习网 www diangon com 关注电工学习网官方微信公众号 电工电气学习 收获更多经验知识 50万 维修电工关注的微信平台 技术分享 学习交流 资料下载 常用的五种电机软启动器 接线图 一 CMC L系列数码型电机软启动器是一
  • 学习笔记 JavaScript ES6 Proxy

    学习内容 代理 常用拦截方法 ES 5当中实现拦截的方法 let obj let newValue Object defineProperty obj name get return newValue set val console log