1、前言根据 MDN 官网解释: Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与 proxy handlers (en-US) 的方法相同。 Reflect 不是一个函数对象,因此它是不可构造的。 那么它到底是什么?根据上面文件介绍会发现它和 Proxy 极像,都是获取执行函数本身信息。主要是区别在于所有的函数对象属性过于复杂,而且额外增加可能会导致程序行为不合理,所以扩展 Reflect 函数来专门对函数对象处理调用方法,构造对象,获取或者设置属性等相关操作。
2、接口Reflect 里面所有的方法都是静态方法,不需要构造函数或者实例化它。
Reflect.apply (target , thisArgument , argumentsList )、对一个函数进行调用操作,同时可以传入一个数组作为调用参数。和 Function.prototype.apply() 功能类似。 Reflect.construct (target , argumentsList[, newTarget/] )对构造函数进行 new 操作,相当于执行 new target (...args) 。 Reflect.defineProperty (target , propertyKey , attributes )和 Object.defineProperty() 类似。如果设置成功就会返回 true Reflect.deleteProperty(target, propertyKey) 作为函数的 delete 操作符,相当于执行 delete target[name] 。 Reflect.get(target, propertyKey[, receiver/]) 获取对象身上某个属性的值,类似于 target[name] 。 Reflect.getOwnPropertyDescriptor(target, propertyKey) 类似于 Object.getOwnPropertyDescriptor() 。如果对象中存在该属性,则返回对应的属性描述符, 否则返回 undefined . Reflect.getPrototypeOf(target) 类似于 Object.getPrototypeOf() 。 Reflect.has(target, propertyKey) 判断一个对象是否存在某个属性,和 in 运算符 的功能完全相同。 Reflect.isExtensible(target) 类似于 Object.isExtensible() . Reflect.ownKeys(target) 返回一个包含所有自身属性(不包含继承属性)的数组。(类似于 Object.keys() , 但不会受 enumerable 影响 ). Reflect.preventExtensions(target) 类似于 Object.preventExtensions() 。返回一个 Boolean 。 Reflect.set(target, propertyKey, value[, receiver/]) 将值分配给属性的函数。返回一个 Boole an ,如果更新成功,则返回 true 。 Reflect.setPrototypeOf(target, prototype) 设置对象原型的函数. 返回一个 Boolean , 如果更新成功,则返回 true 。
3、简单的例子比如现在有个函数: class Person { constructor(firstName, lastName) { this.firstName = firstName this.lastName = lastName } get getName() { return this.firstName + ' ' + this.lastName }} 正常使用只需要进行实例化即可: const person = new Person('Jaxson', 'Wang')console.log(person.getName) // Jaxson Wang 可以使用 Reflect.construct() 方法来创建对象: const person = Reflect.construct(Person, ['Jaxson', 'Wang'])console.log(person) // Jaxson Wang
4、结语Reflect 对象经常和 Proxy 代理一起使用,原因有三点: Reflect 提供的所有静态方法和 Proxy 第2个 handle 参数方法是一模一样的。 Proxy get/set() 方法需要的返回值正是 Reflect 的get/set 方法的返回值,可以天然配合使用,比直接对象赋值/获取值要更方便和准确。 receiver 参数具有不可替代性。 到此这篇关于JavaScript 反射学习技巧的文章就介绍到这了,更多相关JavaScript 反射内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net! 下载地址: react封装全局弹框的方法 jquery实现简单的弹窗效果 |