Reflect

Reflect 对象和Proxy对象一样, 为操作对象提供了新的API。

为什么使用 Reflect的方式来操作对象?

  • 将 Object 对象上一些明显属于内部的方法放到 Reflect对象上。比如 Object.defindProperty 也可以使用 Reflect.defindProperty

  • 修改某些 Object 方法的返回结果

  • 让 Object 操作都变成函数行为。

  • Reflect 对象的操作方法和 Proxy的方法一一对应, 很方便 Proxy对象来调用 Reflect 方法

例子:

    const sum = function (num1, num2) {
        return num1 + num2
    }
    const proxy = new Proxy(sum, {
        apply(target, context, args) {
            return Reflect.apply(...arguments) * 2
        }
    })
    proxy(1,2)  // 6

以上代码 proxy 的配置方法 apply和 Reflect的apply方法是对应关系,直接通过 Reflect.apply 来调用拦截函数 sum。并将函数执行后的结果 * 2。最终的结果是 6。

#### Reflect 对象和 Proxy的静态方法一样,同样是13个。

  • Reflect.apply(target, context, args)
  • Reflect.get(target, key, context)
  • Reflect.set(target, key, value, context)
  • Reflect.construct(target, args)
  • Reflect.defindProperty(target, key, desc)
  • Reflect.has(target, key)
  • Reflect.deleteProperty(target, key)
  • Reflect.setProperty(target, proto)
  • Reflect.getProperty(target)
  • Reflect.ownKeys(target)
  • Reflect.isExtensible(target)
  • Reflect.preventExtensions(target)
  • Reflect.getOwnPropertyDescriptor(target, key)

Reflect.get(target, key, context)

target: 查找的对象
key: 查找的属性
context: 读取getter函数的上下文对象

    const obj = {
        name: 'qiqingfu',
        get sayName() {
            console.log(this.name)
        }
    }
    const obj1 = {
        name: 'zhangfei'
    }
    Reflect.get(obj, 'name')  // qiqingfu
    Reflect.get(obj, 'sayName', obj1) // zhangfei 

如果第一个参数不是对象, Reflect.get方法会报错。

Reflect.set(target, key, value, context)

target: 要给哪个对象设置
key: 要设置的属性
value: 设置的值
返回值: boolean

    const obj = {
      value: 1,
      set fn(newValue) {
        return this.value = newValue
      }
    }
    console.log(Reflect.set(obj, 'name', 'qiqingfu'))  // true
    console.log(Reflect.set(obj, 'fn', 2))
    console.log(obj)

以上代码,给obj对象设置了一个name属性,其值为qiqingfu, 并且设置fn的时候被get函数拦截到了。

Reflect.has(target, key) 方法检测 target对象上有么有 key这个属性

返回值: boolean

const obj = {
      name: 'qiqingfu',
      a: 2
    }
    console.log(Reflect.has(obj, 'name'))  // true
    console.log(Reflect.has(obj, 'a'))     // true
    console.log(Reflect.has(obj, 'b'))     // false

其实 Reflect.hasin 操作符类似。

Reflect.construct(target, args) 方法用于类似于 new 操作符

target: 目标函数
args: 实例化对象需要传递的参数 Array
返回值: 实例对象

    function Prosen (name, age) {
      this.name = name;
      this.age = age
    }
    const prosen = Reflect.construct(Prosen, ['qiqingfu', 22])
    // {name: 'qiqingfu', age: 22}

以上代码使用 Reflect.construct方法实例话一个对象,接受的参数为数组类型

Reflect.defineProperty(target, key, decs) 和 Object.defineProperty(target, key, decs) 一样

更推崇使用前者。

方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

    const obj = {

    }
    Reflect.defineProperty(obj, 'a', {
      value: 1,
      configurable: true, // 可配置
      writable: true      // 可写
    })
    // {a: 1}

以上代码给 obj 对象添加了一个 a属性, 其值为1并且是可配置和可修改的

Reflect.deleteProperty(target, key) 方法删除 target对象的key属性

    const obj = {
        a: 1
    }
    Reflect.defindProperty(obj, 'a')
    console.log(obj) // {}

Reflect.getPropertyOf(target) 方法获取一个对象的原型对象

    function Prosen() {

    }
    Prosen.prototype.age = 21
    const prosen = Reflect.construct(Prosen, [])
    // 获取原型对象的属性
    const proto = Reflect.getPrototypeOf(prosen)
    console.log(proto)
    // {age: 21, constructor: ƒ}

以上代码 给 Prosen 构造函数的原型对象上添加了一个 age属性。并且通过 Reflect.construct方法实例化一个对象。那么就可以通过 Reflect.getPrototypeOf 方法获取一个对象的原型对象。

Reflect.setPrototypeOf(target, proto) 方法将 proto设置为 target对象的原型对象

    function Prosen() {

    }
    Prosen.prototype.age = 21
    const prosen = Reflect.construct(Prosen, [])

   // 设置prosen 的原型对象
   Reflect.setPrototypeOf(prosen, {b: 2}) 

此时, prosen的原型对象为 {b:2}, 而 construct 指针会被覆盖

Reflect.ownKeys(target) 获取对象的key值,返回值为数组

Object.ownKeys 相同。

    const obj = {
      a: 1,
      [Symbol('c')]: 3,
    }
    Reflect.defineProperty(obj, 'b', {
      value: 2,
      configurable: true,
      enumerable: true
    })
    console.log(Reflect.ownKeys(obj))
    // ["a", "b", Symbol(c)]

返回值是一个数组, 存放着对象的 key值的集合。

Reflect.getOwnPropertyDescriptor(target, key) 方法获取一个对象key值的描述对象

返回值: Object

    const obj = {
      a: 1,
      [Symbol('c')]: 3,
    }
    Reflect.defineProperty(obj, 'b', {
      value: 2,
      configurable: true,
      enumerable: true
    })
    const decs = Reflect.getOwnPropertyDescriptor(obj, 'b')
    console.log(decs)
    /*
      {value: 2, writable: false, enumerable: true, configurable: true}
    */

以上代码通过 Reflect.getOwnPropertyDescriptor方法获取一个对象属性的描述对象, 如果第一个参数不是对象会报错。而在 Object.getOwnPropertyDescriptor不会报错,只不过返回 undefind

ES6 Reflect使用笔记的更多相关文章

  1. ES6 Reflect的认识

    首先我们要了解一下,为什么会新添加这么一个全局对象?如果你看过Reflect的一些函数,你就会发现,这个对象上的方法基本上都可以从Object上面找到,找不到的那些,也是可以通过对对象命令式的操作去实 ...

  2. ES6 Reflect 与 Proxy

    概述 Proxy 与 Reflect 是 ES6 为了操作对象引入的 API . Proxy 可以对目标对象的读取.函数调用等操作进行拦截,然后进行操作处理.它不直接操作对象,而是像代理模式,通过对象 ...

  3. es6 Reflect对象详解

    Reflect是ES6为操作对象而提供的新API,而这个API设计的目的只要有: 将Object对象的一些属于语言内部的方法放到Reflect对象上,从Reflect上能拿到语言内部的方法.如:Obj ...

  4. ES6 Reflect

    1.Reflect概述 ES6 为了操作对象而提供的新 API 2.Reflect设计目的 (1)将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到 ...

  5. 《深入理解ES6》读书笔记

    文章目录 第一章 块级绑定 1. var 声明与变量提升 2. let 与 var 的区别 第二章 字符串与正则表达式 1.字符串扩展 1.1 includes().startsWith() .end ...

  6. es6小白学习笔记(一)

    1.let和const命令 1.es6新增了let和const命令,与var用法类似,但它声明的变量只在let所在的代码块内有效(块级作用域,es5只有全局和函数作用域) { let a = 1; v ...

  7. ES6新属性笔记

    一.destructuring--解构赋值 1.数组解构赋值 (1)完全解构 let [a,b,c] = [1,2,3];//普通 console.log(a+":"+b+&quo ...

  8. Es6模块语法笔记

    /** * Created by Administrator on 2017/4/15. */ /*---------------------export命令--------------------- ...

  9. JavaScript(ES6)学习笔记-Set和Map数据结构(一)

    一.Set 1.ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. , , , , ']); s; // ...

随机推荐

  1. Github网站css加载不出来的处理方法(转,亲测有效)

    转载链接:https://blog.csdn.net/qq_36589706/article/details/80573008因为工作需求,自己会经常使用到github,但是突然有一天打开github ...

  2. 微信授权登录(OAuth2.0)-- 随记

    1.OAuth2.0简介 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户 ...

  3. kindle资源

    化繁为简!Kindle 漫画和电子书 资源汇总 & 用法 刚入Kindle那会,在网上翻看了不少文章,有的讲怎么下载电子书,有的讲怎么看漫画,有的讲怎么设置推送邮箱…… 好吧,我不想在用Kin ...

  4. python大战机器学习——半监督学习

    半监督学习:综合利用有类标的数据和没有类标的数据,来生成合适的分类函数.它是一类可以自动地利用未标记的数据来提升学习性能的算法 1.生成式半监督学习 优点:方法简单,容易实现.通常在有标记数据极少时, ...

  5. selenium框架安装及webdriver安装

    本文介绍的是selenium安装及webdriver安装.小实例 1.selenium介绍 selenium是一个用于web应用程序测试的工具. Selenium测试直接运行在浏览器,就向真正的用户操 ...

  6. 01.Spring Ioc 容器

    基本概念 Spring 的 Ioc 容器,通常也称应用上下文.它包含了两个概念 Ioc 和 容器: 容器:顾名思义就是用来装东西的,在 Spring 中容器里盛放的就是各种各样的 Bean.既然装了东 ...

  7. (转)linux内核参数注释与优化

    linux内核参数注释与优化 原文:http://blog.51cto.com/yangrong/1321594 http://oldboy.blog.51.cto.com/2561410/13364 ...

  8. <rhel6 mysql replication>

    MySQL 支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务 ...

  9. 大数据kafka视频教程 学习记录【B站尚硅谷 】

    视频地址: https://www.bilibili.com/video/av35354301/?p=1           2019/03/06 21:59 消息队列的内部实现: Kafka基础: ...

  10. 关于IE的一些hack

    TIPS:对于完全放弃IE的幸福开发者,以下内容全是废话,建议跳转到 博客园 着页,寻找更优质的文章. 对于前端开发来说IE一直是心里的痛,不管你觉得做的多好的网页,放到它上面总会有一些意想不到的问题 ...