欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaScript 反射学习技巧

程序员文章站 2022-06-25 12:14:18
目录1、前言根据 mdn 官网解释: reflect 是一个内置的对象,它提供拦截 javascript 操作的方法。这些方法与 proxy handlers (en-us) 的方法相同。 refle...

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\])将值分配给属性的函数。返回一个 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() 方法需要的返回值正是 reflectget/set 方法的返回值,可以天然配合使用,比直接对象赋值/获取值要更方便和准确。
  • receiver 参数具有不可替代性。

到此这篇关于javascript 反射学习技巧的文章就介绍到这了,更多相关javascript 反射内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关标签: JavaScript 反射