Js中Reflect对象

ReflectES6JavaScript内置的对象,提供拦截JavaScript操作的方法,这些方法与Proxy对象的handlers中的方法基本相同。

描述

Reflect并非一个构造函数,所以不能通过new运算符对其进行调用,或者将Reflect对象作为一个函数来调用,就像Math对象一样,Reflect对象的所有属性和方法都是静态的。

实际上Reflect对象是ES6为操作对象而提供的新API,而这个API设计的目的主要有:

  • Object对象的一些属于语言内部的方法放到Reflect对象上,从Reflect上能拿到语言内部的方法,例如Object.defineProperty方法。
  • 修改某些Object方法返回的结果,例如Object.defineProperty(obj, name, desc)方法在无法定义属性的时候会抛出异常,而Reflect.defineProperty(obj, name, desc)方法在操作失败时则会返回false
  • Object的操作都变成函数行为,例如Object的命令式name in objdelete obj[name]Reflect.has(obj, name)Reflect.deleteProperty(obj, name)相等。
  • 使Reflect对象的方法与Proxy对象的方法一一对应,只要Proxy对象上能够定义的handlers方法Reflect也能找到。

方法

Reflect.apply()

Reflect.apply(target, thisArgument, argumentsList)

静态方法Reflect.apply()通过指定的参数列表发起对目标target函数的调用,和Function.prototype.apply()功能类似。

  • target: 目标函数。
  • thisArgument: target函数调用时绑定的this对象。
  • argumentsList: target函数调用时传入的实参列表,该参数应该是一个类数组的对象。
  • return: 返回值是调用完带着指定参数和this值的给定的函数后返回的结果。
var obj = {name: "11"};
function target(a, b){
console.log(this.name);
console.log(a, b);
}
Reflect.apply(target, obj, [1, 2]); // 11 // 1 2

Reflect.construct()

Reflect.construct(target, argumentsList[, newTarget])

Reflect.construct()方法的行为像new操作符构造函数,相当于运行new target(...args)

  • target: 被运行的目标构造函数。
  • argumentsList: 类数组对象,目标构造函数调用时的参数。
  • newTarget: 可选,作为新创建对象的原型对象的constructor属性,默认值为target
function Target(a, b){
console.log(a, b);
}
var instance = Reflect.construct(Target, [1, 2]); // 1 2
console.log(instance instanceof Target); // true

Reflect.defineProperty()

Reflect.defineProperty(target, propertyKey, attributes)

方法Reflect.defineProperty()基本等同于Object.defineProperty()方法,唯一不同是返回Boolean值。

  • target: 目标对象。
  • propertyKey: 要定义或修改的属性的名称。
  • attributes: 要定义或修改的属性的描述。
  • return: 返回Boolean值指示了属性是否被成功定义。
var obj = {_name: 11};
var success = Reflect.defineProperty(obj, "name", {
get:function(){
console.log("getter");
return obj._name;
}
})
console.log(success); // true
console.log(obj.name); // getter // 11

Reflect.deleteProperty()

Reflect.deleteProperty(target, propertyKey)

方法Reflect.deleteProperty()允许用于删除属性,类似于delete operator,但它是一个函数。

  • target: 删除属性的目标对象。
  • propertyKey: 需要删除的属性的名称。
  • return: 返回Boolean值表明该属性是否被成功删除。
var obj = {name: 11};
var success = Reflect.deleteProperty(obj, "name");
console.log(success); // true
console.log(obj.name); // undefined

Reflect.get()

Reflect.get(target, propertyKey[, receiver])

Reflect.get()方法与从对象target[propertyKey]中读取属性类似,但它是通过一个函数执行来操作的。

  • target: 需要取值的目标对象
  • propertyKey: 需要获取的值的键值
  • receiver: 如果target对象中指定了getterreceiver则为getter调用时的this值。
  • return: 返回属性的值。
var obj = {name: 11};
var name = Reflect.get(obj, "name");
console.log(name); // 11

Reflect.getOwnPropertyDescriptor()

Reflect.getOwnPropertyDescriptor(target, propertyKey)

方法Reflect.getOwnPropertyDescriptor()Object.getOwnPropertyDescriptor()方法相似,如果在对象中存在,则返回给定的属性的属性描述符,否则返回undefined

  • target: 需要寻找属性的目标对象。
  • propertyKey: 获取自己的属性描述符的属性的名称。
var obj = {name: 11};
var des = Reflect.getOwnPropertyDescriptor(obj, "name");
console.log(des); // {value: 11, writable: true, enumerable: true, configurable: true}

Reflect.getPrototypeOf()

Reflect.getPrototypeOf(target)

方法Reflect.getPrototypeOf()Object.getPrototypeOf()方法几乎相同,都是返回指定对象的原型,即内部的[[Prototype]]属性的值。

  • target: 获取原型的目标对象。
  • return: 给定对象的原型,如果给定对象没有继承的属性,则返回null
var obj = {name: 11};
var proto = Reflect.getPrototypeOf(obj);
console.log(proto === Object.prototype); // true

Reflect.has()

Reflect.has(target, propertyKey)

方法Reflect.has()作用与in操作符类似,但它是通过一个函数执行来操作的。

  • target: 目标对象.
  • propertyKey: 属性名,需要检查目标对象是否存在此属性。
  • return: 返回一个Boolean类型的对象指示是否存在此属性。
var obj = {name: 11};
var exist = Reflect.has(obj, "name");
console.log(exist); // true

Reflect.isExtensible()

Reflect.isExtensible(target)

方法Reflect.isExtensible()判断一个对象是否可扩展,即是否能够添加新的属性,与Object.isExtensible()方法相似。

  • target: 检查是否可扩展的目标对象。
  • return: 返回一个Boolean值表明该对象是否可扩展。
var obj = {name: 11};
var extensible = Reflect.isExtensible(obj);
console.log(extensible); // true

Reflect.ownKeys()

Reflect.ownKeys(target)

方法Reflect.ownKeys()返回一个由目标对象自身的属性键组成的数组。

  • target: 获取自身属性键的目标对象。
  • return: 返回由目标对象的自身属性键组成的Array
var obj = {name: 11};
var keys = Reflect.ownKeys(obj);
console.log(keys); // ["name"]

Reflect.preventExtensions()

Reflect.preventExtensions(target)

方法Reflect.preventExtensions()方法阻止新属性添加到对象,防止将来对对象的扩展被添加到对象中,该方法与Object.preventExtensions()相似。

  • target: 阻止扩展的目标对象。
  • return: 返回一个Boolean值表明目标对象是否成功被设置为不可扩展。
var obj = {name: 11};
Reflect.preventExtensions(obj);
console.log(Reflect.isExtensible(obj)); // false

Reflect.set()

Reflect.set(target, propertyKey, value[, receiver])

方法Reflect.set()是在一个对象上设置一个属性。

  • target: 设置属性的目标对象。
  • propertyKey: 设置的属性的名称。
  • value: 设置的值。
  • receiver: 如果遇到setterreceiver则为setter调用时的this值。
  • return: 返回一个Boolean值表明是否成功设置属性。
var obj = {name: 1};
Reflect.set(obj, "name", 11);
console.log(Reflect.get(obj, "name")); // 11

Reflect.setPrototypeOf()

Reflect.setPrototypeOf(target, prototype)

除了返回类型以外,方法Reflect.setPrototypeOf()Object.setPrototypeOf()方法是一样的,它可设置对象的原型即内部的[[Prototype]]属性,为另一个对象或null,如果操作成功返回true,否则返回false

  • target: 设置原型的目标对象。
  • prototype: 对象的新原型,为一个对象或null
  • return: 返回一个Boolean值表明是否原型已经成功设置。
var obj = {};
var proto = {name: 11};
Reflect.setPrototypeOf(obj, proto);
console.log(proto === Reflect.getPrototypeOf(obj)); // true

对比

Method Name Object Reflect
defineProperty() Object.defineProperty()返回传递给函数的对象,如果未在对象上成功定义属性,则返回TypeError 如果在对象上定义了属性,则Reflect.defineProperty()返回true,否则返回false
defineProperties() Object.defineProperties() 返回传递给函数的对象。如果未在对象上成功定义属性,则返回TypeError N/A
set() N/A 如果在对象上成功设置了属性,则Reflect.set()返回true,否则返回false。如果目标不是Object,则抛出TypeError
get() N/A Reflect.get()返回属性的值。如果目标不是Object,则抛出TypeError
deleteProperty() N/A 如果属性从对象中删除,则Reflect.deleteProperty()返回true,否则返回false
getOwnPropertyDescriptor() 如果传入的对象参数上存在Object.getOwnPropertyDescriptor() ,则会返回给定属性的属性描述符,如果不存在,则返回undefined 如果给定属性存在于对象上,则Reflect.getOwnPropertyDescriptor()返回给定属性的属性描述符。如果不存在则返回undefined,如果传入除对象(原始值)以外的任何东西作为第一个参数,则返回TypeError
getOwnPropertyDescriptors() Object.getOwnPropertyDescriptors()返回一个对象,其中包含每个传入对象的属性描述符。如果传入的对象没有拥有的属性描述符,则返回一个空对象。 N/A
getPrototypeOf() Object.getPrototypeOf()返回给定对象的原型。如果没有继承的原型,则返回null。在ES5中为非对象抛出TypeError Reflect.getPrototypeOf()返回给定对象的原型。如果没有继承的原型,则返回null,并为非对象抛出TypeError
setPrototypeOf() 如果对象的原型设置成功,则Object.setPrototypeOf()返回对象本身。如果设置的原型不是Objectnull,或者被修改的对象的原型不可扩展,则抛出TypeError 如果在对象上成功设置了原型,则Reflect.setPrototypeOf()返回true,否则返回false(包括原型是否不可扩展)。如果传入的目标不是Object,或者设置的原型不是Objectnull,则抛出TypeError
isExtensible() 如果对象是可扩展的,则Object.isExtensible()返回true,否则返回false,如果第一个参数不是对象,则在ES5中抛出TypeError,在ES2015中,它将被强制为不可扩展的普通对象并返回false 如果对象是可扩展的,则Reflect.isExtensible()返回true,否则返回false。如果第一个参数不是对象,则抛出TypeError
preventExtensions() Object.preventExtensions()返回被设为不可扩展的对象,如果参数不是对象,则在ES5中抛出TypeError,在ES2015中,参数如为不可扩展的普通对象,然后返回对象本身。 如果对象已变得不可扩展,则Reflect.preventExtensions() 返回true,否则返回false。如果参数不是对象,则抛出TypeError
keys() Object.keys()返回一个字符串数组,该字符串映射到目标对象自己的(可枚举)属性键。如果目标不是对象,则在ES5中抛出TypeError,但将非对象目标强制为ES2015中的对象 N/A
ownKeys() N/A Reflect.ownKeys()返回一个属性名称数组,该属性名称映射到目标对象自己的属性键,如果目标不是Object,则抛出TypeError

每日一题

https://github.com/WindrunnerMax/EveryDay

参考

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect

Js中Reflect对象的更多相关文章

  1. 深入理解JS中的对象(三):class 的工作原理

    目录 序言 class 是一个特殊的函数 class 的工作原理 class 继承的原型链关系 参考 1.序言 ECMAScript 2015(ES6) 中引入的 JavaScript 类实质上是 J ...

  2. js中判断对象具体类型

    大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...

  3. 浅解析js中的对象

    浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...

  4. js中XMLHttpRequest对象实现GET、POST异步传输

    js中XMLHttpRequest对象实现GET.POST异步传输 /* * 统一XHR接口 */ function createXHR() { // IE7+,Firefox, Opera, Chr ...

  5. JavaScript学习12 JS中定义对象的几种方式

    JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...

  6. js中推断对象详细类型

    大家可能知道js中推断对象类型能够用typeof来推断. 看以下的情况 <script> alert(typeof 1);//number alert(typeof "2&quo ...

  7. JavaScript学习12 JS中定义对象的几种方式【转】

    avaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...

  8. JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘

    一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...

  9. JS中定义对象和集合

    在js中定义对象: 方式一: var obj = {}; obj['a']=1; obj['b']=2; 方式二: var obj=new Object(); obj.a=1; obj.b=2; 在j ...

  10. Js中Map对象的使用

    Js中Map对象的使用 1.定义 键/值对的集合. 2.语法 mapObj = new Map() 3.备注 集合中的键和值可以是任何类型.如果使用现有密钥向集合添加值,则新值会替换旧值. 4.属性 ...

随机推荐

  1. SkyWalking的学习之二(性能优化以及log)

    SkyWalking的学习之二(性能优化以及log) 背景 周六在家学习了SkyWalking的交单部署和agent的方式获取日志. 万恶的周天上班到公司发现出现了宕机. 具体原因是我想进行SkyWa ...

  2. [转帖]crontab 定时任务,免交互式编写任务文件

    https://www.jianshu.com/p/8eab68bcfc8e 正常添加定时任务是在命令行使用命令 crontab -ecrontab -e编写完的文件怎么找到?文件默认保存在/var/ ...

  3. [转帖]wiki Rust

    Rust[编辑] 维基百科,自由的百科全书       跳到导航跳到搜索   此条目介绍的是由Mozilla主导开发的编程语言.关于"rust"在英文中的本意,请见"铁锈 ...

  4. redis-shake

    https://github.com/alibaba/RedisShake/wiki/%E8%BF%90%E8%A1%8C%E7%9B%91%E6%8E%A7 redis-shake is a too ...

  5. WebAssembly入门笔记[1]:与JavaScript的交互

    前一阵子利用Balazor开发了一个NuGet站点,对WebAssembly进行了初步的了解,觉得挺有意思.在接下来的一系列文章中,我们将通过实例演示的方式介绍WebAssembly的一些基本概念和编 ...

  6. 【VictoriaMetrics源码阅读】: vm中对map的优化

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu github 公众号:一本正经的瞎扯 具体代码请看:https://github.com/ahf ...

  7. HUBUCTF 2022新生赛Writeup

    既然是母校,那一定要好好对待~    2024-01-13 22:42:34 WEB  [HUBUCTF 2022 新生赛]checkin 题目链接:checkin 原题 <?php show_ ...

  8. fbx查看软件

    对于3D的模型资源,比如fbx文件,除了使用专业的软件查看外,比如Unity3D,vs2015及更高版本,maya,3DMax等等,有没有更加轻量的软件可以查看fbx的内容呢? win10自带 win ...

  9. vim 从嫌弃到依赖(22)——自动补全

    这篇文章我们将讨论 vim 自带的自动补全功能.当然,针对自动补全功能有许多好用的插件,但是了解vim自带的功能有助于我们更好的用来插件的补全功能.因为我见过有的配置文件将插件的功能配置的比原有的更难 ...

  10. 小白学k8s(12)-k8s中PV和PVC理解

    pv和pvc 什么是pv和PVC 生命周期 PV创建的流程 1.创建一个远程块存储,相当于创建了一个磁盘,称为Attach 2.将这个磁盘设备挂载到宿主机的挂载点,称为Mount 3.绑定 持久化卷声 ...