JavaScript 反射学习技巧

 更新时间:2021年10月15日 10:23:24   作者:淮城一只猫  
这篇文章主要给大家分享的是JavaScript 的反射学习技巧,主要是区别在于所有的函数对象属性过于复杂,而且额外增加可能会导致程序行为不合理,所以扩展 Reflect 函数来专门对函数对象处理调用方法,构造对象,获取或者设置属性等相关操作。下面一起进入文章内容吧

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的24+数组方法

    徒手实现关于JavaScript的24+数组方法

    数组是我们日常工作中用的最频繁的一类数据结构,能帮助我们解决许多问题,而其本身也包含接近33个之多的方法,做了一个脑图分类如下,熟练使用数组的你,是否想知道他们内部的实现原理呢?接下来小编就带大家进入主题,希望能帮助到你
    2021-09-09
  • JavaScript API ResizeObserver使用示例

    JavaScript API ResizeObserver使用示例

    这篇文章主要为大家介绍了JavaScript API ResizeObserver的使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 微信小程序 免费SSL证书https、TLS版本问题的解决办法

    微信小程序 免费SSL证书https、TLS版本问题的解决办法

    这篇文章主要介绍了微信小程序 免费SSL证书https、TLS版本问题的解决办法的相关资料,需要的朋友可以参考下
    2016-12-12
  • JS网页repaint与reflow 的区别及优化方式

    JS网页repaint与reflow 的区别及优化方式

    这篇文章主要为大家介绍了JS网页repaint与reflow 的区别及优化方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 基于JavaScript ES新特性let与const关键字

    基于JavaScript ES新特性let与const关键字

    这篇文章主要介绍了基于JavaScript ES新特性let与const关键字,let是ECMAScript 2015新增的一个关键字,用于声明变量,const关键字用于声明一个常量,更多详细内容,请需要的小伙伴参考下面文章的介绍,希望对你有所帮助
    2021-12-12
  • HTML TO JavaScript 转换

    HTML TO JavaScript 转换

    HTML TO JavaScript 转换...
    2006-06-06
  • 使用xml2js库进行XML数据解析

    使用xml2js库进行XML数据解析

    这篇文章主要为大家介绍了使用xml2js库进行XML数据解析用法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • element弹窗表格的字体模糊bug解决

    element弹窗表格的字体模糊bug解决

    这篇文章主要为大家介绍了element弹窗表格的字体模糊bug解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 前端利用jsencrypt.js进行RSA加密示例详解

    前端利用jsencrypt.js进行RSA加密示例详解

    这篇文章主要为大家介绍了前端利用jsencrypt.js进行RSA加密示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 微信小程序返回多级页面的实现方法

    微信小程序返回多级页面的实现方法

    这篇文章主要介绍了微信小程序返回多级页面的实现方法的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下
    2017-10-10

最新评论