ES6入门系列

Wesley13
• 阅读 671

  Reflect   是ES6 为了操作对象而提供的新的API, 目的是:

  1. 将Object 上一些明显属于语言内部的方法,比如 Object.defineProperty  放到 Reflect对象上

现阶段某些方法同时在Object  ,  Reflect 上部署,  未来的新方法将只在Reflect对象上部署,也就是说

从Reflect对象上可以获得语言内部的方法。

         2. 修改某些Object 方法的返回结果,让其变得更合理。

    3.让Object的操作都变成函数行为。某些Object操作是命令式,比如name in obj   和  

delete obj[name],    而Reflect.has(obj, name)  和  Reflect.deleteProperty(obj, name)  让它们变成了函数行为。

   4.Reflect 对象的方法与Proxy 对象的方法一一对应, 只要是Proxy 对象上的方法, 就能在Reflect 对象上找到对应的方法。这就使Proxy对象可以方便地调用对应Reflect的方法来完成默认行为,作为修改行为的基础。无论Proxy怎么修改默认行为,我们总可以在Reflect上获取默认行为。

      看个例子:

const des = {
    name: 'liu',
    age: 18
};
const newDes = new Proxy(des, {
    set: function (target, name, value, receiver) {
        let res = Reflect.set(target, name, value, receiver);
        // 额外行为
        if (res) {
            console.log(res)
            Reflect.set(target, 'age', 80, receiver);
        }
        return res
    }
});
console.log(newDes);
newDes.name = 'xxxx';
console.log(newDes);

我们对  对象des  的set 方法  做了一层拦截, 每当newDes 设置值的时候,我们先用

Reflect.set() 保证默认行为, 默认行为成功后 再执行我们的额外行为,也就是把age 变成80.

看下执行结果:

ES6入门系列

OK , 默认行为name设置成功, 额外行为age也设置成功,

我们还可以代理对象内部的其他方法:

const des = {
    name: 'liu',
    age: 18
};
const newDes = new Proxy(des, {
    set(target, name, value, receiver) {
        let res = Reflect.set(target, name, value, receiver);
        // 额外行为
        if (res) {
            console.log(res);
            Reflect.set(target, 'age', 80, receiver);
        }
        return res
    },
    deleteProperty(target, p) {
        console.log('delete ' + p);
        return Reflect.deleteProperty(target, p);
    },
    get(target, p, receiver) {
        console.log('get ' + p);
        return Reflect.get(target, p, receiver);
    }
});
const name = newDes.name;
delete newDes.age;

拦截对象的get方法 和 delete 指令

结果:

ES6入门系列

拦截成功。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
java的反射机制
java中的反射可以将代码结构更加灵活,通过反射机制可以访问属性、方法和构造方法sun公司为我们提供的4大类反射:java.lang.reflect.methodjava.lang.Classjava.lang.reflect.modifierjava.lang.reflect.Constructor有以下几种方式:比如是Employ
Wesley13 Wesley13
3年前
Java 反射,Java reflect
 reflect是Java开发语言特征之一,在lang包下;它允许运行中的Java程序对自身进行检测。并能直接操作程序内部的属性。importjava.lang.reflect.Field;publicclassextendsTest{publicstaticvoidmain(St
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这