Proxy 定义

Proxy用于修改对象的某些行为,获取值,设置值等

let p = new Proxy(target, handler);
  • target 用Proxy包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
  • 一个对象,其属性是当执行一个操作时定义代理的行为的函数。

Proxy.revocable()方法

let {proxy,revocable} = Proxy.revocable(target, handler);
  • target,handler参数和new Proxy()一致。
  • revoke()方法调用后,代理会变为无效状态。

示例如下:

handler对象

handler get

拦截对象属性值的获取。

get(target, property, receiver)

handler set

拦截对象属性值的设置。

set(target, property, value, receiver)

handler deleteProperty

拦截对象属性的删除

deleteProperty(target, property)

handler getOwnPropertyDescriptor

拦截获取对象属性描述。

getOwnPropertyDescriptor(target,property)

handler defineProperty

拦截定义对象属性的描述。

defineProperty(target,property,descriptor)

handler has

拦截判断对象属性是否存在

包括property in proxy 和 Reflect.has , 不包括Object.prototype.hasOwnProperty。

has(target,property)

handler ownKeys

拦截对象自身属性key值的读取操作,返回字符串或Symbol值数组。

  • Object.getOwnPropertyNames()
  • Object..getOwnPropertySymbols()
  • Object.keys()
  • for...in循环
ownKeys(target)

handler apply

拦截函数调用

apply(target,ctx,args)

handler construct

拦截构造函数调用。

construct(target,args)

handler getPrototypeOf

拦截获取对象的原型

  • Object.prototype.__proto__
  • Object.prototype.isPrototypeOf()
  • Object.getPrototypeOf()
  • Reflect.getPrototypeOf()
  • instanceof
getPrototypeOf(target)

handler setPrototypeOf

拦截设置对象的原型。

  • Object.prototype.__proto__
  • Object.setPrototypeOf()
  • Reflect.setPrototypeOf()
setPrototypeOf(target,proto)

handler isExtensible

拦截判断对象是否可扩展

isExtensible(target)

handler preventExtensions

拦截对象的组织扩展方法

preventExtensions(target)

更多关于handler规范,请参考es2015规范的26.2.2章节。

实际应用

监听某个对象,在执行该对象的所有函数时,打印执行前后的日志。

let obj = {
id: 100,
say: function () {
console.log('say exec');
return 'xxx'
}
} let handler = {
get: function (target, property, receiver) {
let value = Reflect.get(target, property, receiver)
if (typeof value === 'function') {
return function (...rest) {
console.log(`before ${property} exec.`);
let res = Reflect.apply(value, target, rest);
console.log(`after ${property} exec.`);
return res;
}
} else {
return value;
}
},
}
let proxy = new Proxy(obj, handler);
proxy.id
proxy.say()

免责声明

本文只是在学习JS 响应式代理中的一些笔记,文中的资料也会涉及到引用,具体出处不详,商业用途请谨慎转载。

Reflection 基础知识(二)的更多相关文章

  1. java 基础知识二 基本类型与运算符

    java  基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...

  2. 菜鸟脱壳之脱壳的基础知识(二) ——DUMP的原理

    菜鸟脱壳之脱壳的基础知识(二)——DUMP的原理当外壳的执行完毕后,会跳到原来的程序的入口点,即Entry Point,也可以称作OEP!当一般加密强度不是很大的壳,会在壳的末尾有一个大的跨段,跳向O ...

  3. Dapper基础知识二

    在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. 2,如何使用Dapper?     首先Dapper是支持多种数据库的 ...

  4. python基础知识(二)

    python基础知识(二) 字符串格式化 ​ 格式: % 类型 ---- > ' %类型 ' %(数据) %s 字符串 ​ print(' %s is boy'%('tom')) ----> ...

  5. Java基础知识二次学习--第三章 面向对象

    第三章 面向对象   时间:2017年4月24日17:51:37~2017年4月25日13:52:34 章节:03章_01节 03章_02节 视频长度:30:11 + 21:44 内容:面向对象设计思 ...

  6. Java基础知识二次学习-- 第一章 java基础

    基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一 ...

  7. 快速掌握JavaScript面试基础知识(二)

    译者按: 总结了大量JavaScript基本知识点,很有用! 原文: The Definitive JavaScript Handbook for your next developer interv ...

  8. Java基础知识二次学习--第六章 常用类

    第六章 常用类   时间:2017年4月26日16:14:49~2017年4月26日16:56:02 章节:06章_01节~06章_06节 视频长度:20:57+1:15+8:44+1:26+11:2 ...

  9. java接口自动化基础知识(二)

    二.HttpClient+testNG实现对接口的测试及校验 在上面第一篇中已经实现了基础配置和测试用例数据准备,本篇文章将以登录举例进行测试执行. 这是之前login接口的代码 @Test(grou ...

随机推荐

  1. windows下 apache 二级域名相关配置 【转】

    转至: http://www.th7.cn/Program/php/201306/141305.shtml 今天给大家总结下 windows 下 apache的二级域名的相关配置 下面就利用本地127 ...

  2. Prompt branches and tab completion

    $ chmod +x ~/.git-prompt.sh $ chmod +x ~/.git-completion.bash $ atom ~/.bash_profile 编辑.bash_profile ...

  3. JavaIO——转换流、字符编码

    1.转换流 转换流是将字节流变成字符流的流. OutputStreamWriter:将字节输出流转换成字符输出流. public class OutputStreamWriter extends Wr ...

  4. 在调用系统相册时,UIIMagePickerController使用中偷换StatusBar颜色的问题

    在调用系统相册时,UIIMagePickerController使用中偷换StatusBar颜色的问题 此时解决办法是 #pragma mark - UIImagePickerController D ...

  5. 注解开发中的@Results注解使用

    package com.hope.dao;import com.hope.domain.User;import com.sun.xml.internal.bind.v2.model.core.ID;i ...

  6. 使用递归方法,遍历输出以.java结尾的文件

    package cn.itcast.demo01;import java.io.File;/** * @author newcityman * @date 2019/7/27 - 19:17 * 题目 ...

  7. 【JavaScript】创建全0的Array

    1.创建一个长度为m的全0数组 var arr = new Array(m).fill(0); 2.创建一个m行n列的全0数组 var arr = new Array(m).fill(new Arra ...

  8. 【Linux】【CentOS7】免密登录突然失效

    [报错解决]免密登录突然失效 哔哩哔哩 萌狼蓝天 博客:萌狼工作室-博客园 [问题描述] 原本配置好了的免密登录,今天启动hadoop发现免密登录失效了 [解决方案] 1.切换到管理员模式,进入配置文 ...

  9. 【简】题解 AWSL090429 【聚会】

    这题直接换根dp 记录在要转移的点的子树中有多少牛 #include<bits/stdc++.h> using namespace std; #define ll long long #d ...

  10. 开发中的PR和MR

    GitLab的是Pull Request缩写.GitHub则是Merge Request也就是MR. 当项目下载后进行更改并提交,每次过程算一次PR,一般会加入管理员审核,通过才能合并到master主 ...