Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法,是 ES6 为了操作对象而提供的新 API。
Reflect不是一个函数对象,因此它是不可构造的。
Reflect的所有属性和方法都是静态的。

意义

  1. 现阶段,某些方法同时在Object和Reflect对象上部署,未来的新方法将只部署在Reflect对象上。
  2. 修改某些Object方法的返回结果,让其变得更规范化。如Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj, name, desc)则会返回false。
  3. 让Object操作都变成函数行为。
  4. Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。

重点

方法

Reflect对象当前有 13 个静态方法。

// 对一个函数进行调用操作,同时可以传入一个数组作为调用参数。
Reflect.apply(target, thisArg, args)
// 对构造函数进行 new 操作,相当于执行 new target(...args)。
Reflect.construct(target, args)
// 获取对象身上某个属性的值,类似于 target[name]。如果没有该属性,则返回undefined。
Reflect.get(target, name, receiver)
// 将值分配给属性的函数。返回一个Boolean,如果更新成功,则返回true。
Reflect.set(target, name, value, receiver)
// Reflect.defineProperty方法基本等同于Object.defineProperty,直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,不同的是,Object.defineProperty返回此对象。而Reflect.defineProperty会返回布尔值.
Reflect.defineProperty(target, name, desc)
// 作为函数的delete操作符,相当于执行 delete target[name]。
Reflect.deleteProperty(target, name)
// 判断一个对象是否存在某个属性,和 in 运算符 的功能完全相同。
Reflect.has(target, name)
// 返回一个包含所有自身属性(不包含继承属性)的数组。(类似于 Object.keys(), 但不会受enumerable影响, Object.keys返回所有可枚举属性的字符串数组).
Reflect.ownKeys(target)
// 判断一个对象是否是可扩展的(是否可以在它上面添加新的属性),类似于 Object.isExtensible()。返回表示给定对象是否可扩展的一个Boolean 。(Object.seal 或 Object.freeze 方法都可以标记一个对象为不可扩展。)
Reflect.isExtensible(target)
// 让一个对象变的不可扩展,也就是永远不能再添加新的属性。
Reflect.preventExtensions(target)
// 如果对象中存在该属性,如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),否则返回 undefined。类似于 Object.getOwnPropertyDescriptor()。
Reflect.getOwnPropertyDescriptor(target, name)
// 返回指定对象的原型.类似于 Object.getOwnPropertyDescriptor()。
Reflect.getPrototypeOf(target)
// 设置对象原型的函数. 返回一个 Boolean, 如果更新成功,则返回true。如果 target 不是 Object ,或 prototype 既不是对象也不是 null,抛出一个 TypeError 异常。
Reflect.setPrototypeOf(target, prototype)

使用

// Reflect.apply
var obj1 = {};
Reflect.apply(Math.floor, obj1, [1.88]) // 1;// Reflect.construct
const obj2 = Reflect.construct(Date, [2021, 3, 1])// Reflect.get
var obj3 = { x: 1, y: 2 };
Reflect.get(obj3, "x"); // 1// Reflect.set
var obj4 = {};
Reflect.set(obj4, "prop", "value"); // true// Reflect.defineProperty(
const obj5 = {};
Reflect.defineProperty(obj5, 'property', {value: 666,writable: false
}); // true// Reflect.deleteProperty
var obj6 = { x: 1, y: 2 };
Reflect.deleteProperty(obj6, "x"); // true
obj; // { y: 2 }// Reflect.has
const obj7 = {x: 0}
Reflect.has(obj7, "x"); // true// Reflect.ownKeys
const obj8 = {z: 3, y: 2, x: 1}
Reflect.ownKeys(obj8); // [ "z", "y", "x" ]// Reflect.isExtensible
var obj9 = {};
Reflect.isExtensible(obj9); // true// Reflect.preventExtensions
var obj10 = {};
Reflect.isExtensible(obj10); // true
Reflect.preventExtensions(obj10);
Reflect.isExtensible(obj10); // false// Reflect.getOwnPropertyDescriptor
const obj11 = {x: "hello"}
Reflect.getOwnPropertyDescriptor(obj11, "x");
// {value: "hello", writable: true, enumerable: true, configurable: true}// Reflect.getPrototypeOf
var obj12 = {};
Reflect.getPrototypeOf(obj12); // 等同于Object.prototype// Reflect.setPrototypeOf
var obj13 = {};
Reflect.setPrototypeOf(obj13, null); // true

js之Reflect相关推荐

  1. Js中Reflect对象

    Js中Reflect对象 Reflect是ES6起JavaScript内置的对象,提供拦截JavaScript操作的方法,这些方法与Proxy对象的handlers中的方法基本相同. 描述 Refle ...

  2. 深入浅出JS—15 ES6中Proxy及Reflect的使用

    在一些前端框架中,常常需要监听数据变化,页面进行响应.为了监听对象的变化,需要对对象的操作进行捕获.本文着重介绍ES6中Proxy代理对象的使用,以及涉及到的映射对象Reflect使用 1. Prox ...

  3. Reflect.ownKeys()与Object.keys()区别 以及 JS中的可枚举属性与不可枚举属性

    代码test1: var obj = {} Object.defineProperty(obj, 'method1', {value: function () {alert("Non enu ...

  4. JS 反射机制及 Reflect 详解

    一.什么是反射机制 反射机制是在编译阶段不知道是哪个类被加载,而是在运行的时候才加载.执行. 也就是说,反射机制指的是程序在运行时能够获取自身的信息. js 中的 apply 就是反射机制. 二.Re ...

  5. JS高级——Proxy、Reflect

    一.监听对象的操作 我们先来看一个需求:有一个对象,我们希望监听这个对象中的属性被设置或获取的过程 通过我们前面所学的知识,能不能做到这一点呢? 其实是可以的,我们可以通过之前的属性描述符中的存储属性 ...

  6. js中的Reflect入门讲解

    这个玩意 和 那个 Proxy 对象一样, 是es6为了操作对象而提供的Api, 个人理解吧,应该是为了防止你直接操作对象(object, 函数),做出的一个代替方案: 比如之前使用的 Obejct. ...

  7. js——Reflect

    目录 一.Reflect.get(data, key, receiver) 二.Reflect.set(data, key,value, receiver) - Reflect是es6新增的api,与 ...

  8. 用es6 (proxy 和 reflect)轻松实现 观察者模式

    js中 观察者 之前我们一般通过事件机制完成 ex: 注册监听 Event.listen('changeName', name => console.log(name)) 派发事件 Event. ...

  9. 【js细节剖析】通过=操作符为对象添加新属性时,结果会受到原型链上的同名属性影响...

    在使用JavaScript的过程中,通过"="操作符为对象添加新属性是很常见的操作:obj.newProp = 'value';.但是,这个操作的结果实际上会受到原型链上的同名属性 ...

最新文章

  1. c#学习之基础篇(filter 筛选器)
  2. linux跨服务器复制文件夹,linux下跨服务器文件文件夹的复制
  3. python语言自学-零基础小白学习Python编程语言的正确姿势(纯干货)
  4. 3名游客在长城墙体上刻字,八达岭长城:已会同公安部门调查取证
  5. 开发可以复用的构件和利用可以复用的构件进行开发
  6. 【2019牛客暑期多校训练营(第三场)- F】Planting Trees(单调队列,尺取)
  7. adb 更新 android sdk,[转载]安装Android时SDK AVD MANAGER时更新报错的解决办法
  8. 11 Django组件-分页器
  9. note同步不及时 one_Win10上OneNote 2016同步老出问题?解决方法送上
  10. css方法div固定在网页底部
  11. python中logging模块详解_python logging日志模块详解
  12. PHP新的连接MySQL方法mysqli
  13. 如何通过提前Bake Docker镜像加快基础设施的启动速度
  14. ABAP 正则表达式(Regular Expressions)
  15. 1067 Sort with Swap(0, i)
  16. matlab语法——subplot函数
  17. element ui table显示本地图片
  18. lda指令是什么意思_lda指令什么意思
  19. 计算机取消右键粘贴,复制粘贴文件后鼠标右击取消粘贴功能的简单方法介绍
  20. Android NDK开发(十三):JNI函数接口详解—线程相关

热门文章

  1. wasm转c调用与封装至dll案例
  2. 小技巧---查看电脑型号
  3. 带分数 -- 蓝桥杯
  4. 微信小程序实现跟odoo的交互 使用xmlrpc和jsonrpc 持续更新中。。。
  5. c++获取umg ue_unreal_ue4使用C++动态载入UMG与Slot
  6. Java使用luhn校验算法实现银行卡号合法性校验获取银行卡号所属银行
  7. 20200215惠普(HP)星14(R5-3500U)在ubuntu20.04下启动通过dmesg打印的内核信息
  8. 从“人工桌面”到“原神”,窥探国产游戏的崛起
  9. ITK图像itk::Image指针参数传递失败
  10. mysql json php 直接使用_PHP面试题大全(值得收藏)