JavaScript的反射学习方法
这篇文章主要讲解了"JavaScript的反射学习方法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"JavaScript的反射学习方法"吧!
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()类似。如果设置成功就会返回trueReflect.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\])将值分配给属性的函数。返回一个Boolean ,如果更新成功,则返回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的反射学习方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!