reflect,reflects

时间:2024-12-14 08:49:32 来源:互联网 浏览:68

什么是Reflect?为什么需要Reflect?有哪些目的和静态方法?

与大多数全局对象不同,

Reflect不是一个构造函数。

不能将其与一个new运算符一起使用,

不能将Reflect对象作为一个函数来调用。

Reflect的所有属性和方法都是静态的。

Reflect对象的设计目的有这样几个:

(1) 将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上。现阶段,某些方法同时在Object和Reflect对象上部署,未来的新方法将只部署在Reflect对象上。也就是说,从Reflect对象上可以拿到语言内部的方法。

(2) 修改某些Object方法的返回结果,让其变得更合理。比如,Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj, name, desc)则会返回false。

(3) 让Object操作都变成函数行为。某些Object操作是命令式,比如name in obj和delete obj[name],而Reflect.has(obj, name)和Reflect.deleteProperty(obj, name)让它们变成了函数行为。

(4)Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。

Reflect对象提供以下静态函数

Reflect.apply()

对一个函数进行调用操作,同时可以传入一个数组作为调用参数。和 Function.prototype.apply() 功能类似。

Reflect.construct()

对构造函数进行 new 操作,相当于执行 new target(...args)。

Reflect.defineProperty()

和 Object.defineProperty() 类似。

Reflect.deleteProperty()

作为函数的delete操作符,相当于执行 delete target[name]。

Reflect.get()

获取对象身上某个属性的值,类似于 target[name]。

Reflect.getOwnPropertyDescriptor()

类似于 Object.getOwnPropertyDescriptor()。

Reflect.getPrototypeOf()

类似于 Object.getPrototypeOf()。

Reflect.has()

判断一个对象是否存在某个属性,和 in 运算符 的功能完全相同。

Reflect.isExtensible()

类似于 Object.isExtensible().

Reflect.ownKeys()

返回一个包含所有自身属性(不包含继承属性)的数组。(类似于 Object.keys(), 但不会受enumerable影响).

Reflect.preventExtensions()

类似于 Object.preventExtensions()。返回一个Boolean。

Reflect.set()

将值分配给属性的函数。返回一个Boolean,如果更新成功,则返回true。

Reflect.setPrototypeOf()

类似于 Object.setPrototypeOf()。

面试官: 工作5年了 不知道Reflect嘛?

  1. Reflect是什么
  2. Reflect都有哪些方法
  3. 这些方法存在的意义是什么
  4. Reflect的方法为什么不放在Object上
  5. Reflect的设计目的是什么
  6. 为什么proxy里一定要使用reflect

在 JavaScript 中,Reflect 是一个内置的全局对象,对一些函数式的操作提供了面向对象的 API。 Reflect 不是一个函数对象,因此它是不可构造的。它所有的方法都是静态的,类似于 Math 对象。

目前共13个静态方法 可以分为函数相关,原型相关,对象相关三大类。

  • Reflect.apply方法用于绑定this对象后执行给定函数。 一般来说,如果要绑定一个函数的this对象,可以这样写fn.apply(obj, args),但是如果函数定义了自己的apply方法,就只能写成Function.prototype.apply.call(fn, obj, args),采用Reflect对象可以简化这种操作。
  • Reflect.construct方法等同于new target(...args),这提供了一种不使用new,来调用构造函数的方法。
  • Reflect.getPrototypeOf 等同于 Object.getPrototypeOf(),用于获取对象的原型(即内部[[Prototype]]属性的值)。
  • Reflect.setPrototypeOf 基本等同于 Object.setPrototypeOf(),用于设置对象的原型(即内部[[Prototype]]属性的值)。
  • Reflect.defineProperty() 方法基本等同于 Object.defineProperty,但返回值略有不同。如果定义属性成功,它会返回true,否则返回false。
  • Reflect.deleteProperty() 方法基本等同于 delete operator,用于删除一个对象的属性。
  • Reflect.get(target, propertyKey, receiver) 方法用于读取属性值,等同于 target[propertyKey],但receiver参数可以改变getter的this对象。
  • Reflect.set(target, propertyKey, value, receiver) 方法用于设置属性值,等同于target[propertyKey] = value,但receiver参数可以改变setter的this对象。
  • Reflect.has(target, propertyKey) 方法基本等同于 propertyKey in target,用于检查一个属性是否在某个对象中。
  • Reflect.getOwnPropertyDescriptor(target, propertyKey) 方法用于获取对象自身的某个属性的属性描述符,等同于Object.getOwnPropertyDescriptor()。
  • Reflect.ownKeys(target) 方法返回一个由目标对象自身的属性键组成的数组,等同于 Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))
  • Reflect.isExtensible(target) 方法用于判断一个对象是否可扩展,等同于 Object.isExtensible()。
  • Reflect.preventExtensions(target) 方法基本等同于 Object.preventExtensions(),用于使一个对象变为不可扩展。如果操作成功则返回true,否则返回false。

Reflect && Object的某些方法是相似甚至相同的,可能有的同学会问,为什么不直接把Reflect的方法放在Object上呢?何必新加一个对象?两者到底有什么区别?

  1. Reflect上不光有对象的相关操作方法还有函数相关的方法 这和Object本身代表的含义不符 因此不能放在Object上。同时Reflect为未来语言的扩展提供了一套可能的API,如果将来JavaScript想要添加新的底层操作对象的方法,它们可以被加入到Reflect上,而不是继续增加Object的静态方法,这样有助于保持Object构造函数的简洁性。
  2. 在Reflect出现之前,JavaScript操作对象的一些方法散布在Object构造函数上,比如Object.defineProperty。但是,这些方法的返回值和错误处理机制并不一致(例如,如果操作失败,一些方法会抛出错误,而其他一些方法则返回false)。Reflect提供了一套具有一致返回值的API,使得这些操作更加统一和可预测。

所以当Reflect和Object方法能实现同样效果时 我们建议优先使用Reflect

在有了上面的一些基本了解后 我们再来谈下Reflect的设计目的:

  1. 统一操作对象的方法:Reflect提供了一套具有一致返回值的API,使得这些操作更加统一和可预测。
  2. 提供未来的新操作 API:Reflect为未来语言的扩展提供了一套可能的API。
  3. 使某些操作更加函数式:JavaScript是一门支持函数式编程的语言,在某些场景中,我们可能更倾向于使用函数而不是命令式的操作。Reflect的方法都是函数更符合js函数式的思想。delete obj.xx, key in obj 这种代码都可以使用reflect替代。当Reflect和操作符(例如delete, in)能实现同样效果时 我们建议优先使用Reflect
  4. 简化错误处理:像之前提到的,传统的对象操作方法在错误处理上不一致。Reflect提供的方法倾向于返回更简明的结果,如布尔值,这简化了错误处理和条件检测。

基本操作包括属性访问和赋值、属性删除、枚举、函数调用、对象构造等等 例如:

即使在特定环境下目标函数的某些行为被覆盖或修改了 Reflect对象依然是调用语言的内部基本操作,而不受外部环境的影响。当然我们通过其他方式也是可以做到的 只是麻烦了一点...

元编程是指编写可以操作或改变其他程序的程序。元编程可以改变 JavaScript 的一些基本操作的行为。主要与这三个对象有关。Symbol:通过内置Symbol值复写 js语言中的基本操作。Reflect:可以获取语言内部的基本操作。Proxy:通过钩子函数 拦截&改变 js语言的基本操作。

这段代码展示了如何使用Proxy对象来拦截对底层对象的操作。

通过这种方法,可以在执行实际操作之前或之后插入自定义行为。这里拦截了三种操作:属性的获取 (get)、设置 (set) 和删除 (deleteProperty)。

什么是Reflect?为什么需要Reflect?有哪些目的和静态方法?

与大多数全局对象不同,

Reflect不是一个构造函数。

不能将其与一个new运算符一起使用,

不能将Reflect对象作为一个函数来调用。

Reflect的所有属性和方法都是静态的。

Reflect对象的设计目的有这样几个:

(1) 将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上。现阶段,某些方法同时在Object和Reflect对象上部署,未来的新方法将只部署在Reflect对象上。也就是说,从Reflect对象上可以拿到语言内部的方法。

(2) 修改某些Object方法的返回结果,让其变得更合理。比如,Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj, name, desc)则会返回false。

(3) 让Object操作都变成函数行为。某些Object操作是命令式,比如name in obj和delete obj[name],而Reflect.has(obj, name)和Reflect.deleteProperty(obj, name)让它们变成了函数行为。

(4)Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。

Reflect对象提供以下静态函数

Reflect.apply()

对一个函数进行调用操作,同时可以传入一个数组作为调用参数。和 Function.prototype.apply() 功能类似。

Reflect.construct()

对构造函数进行 new 操作,相当于执行 new target(...args)。

Reflect.defineProperty()

和 Object.defineProperty() 类似。

Reflect.deleteProperty()

作为函数的delete操作符,相当于执行 delete target[name]。

Reflect.get()

获取对象身上某个属性的值,类似于 target[name]。

Reflect.getOwnPropertyDescriptor()

类似于 Object.getOwnPropertyDescriptor()。

Reflect.getPrototypeOf()

类似于 Object.getPrototypeOf()。

Reflect.has()

判断一个对象是否存在某个属性,和 in 运算符 的功能完全相同。

Reflect.isExtensible()

类似于 Object.isExtensible().

Reflect.ownKeys()

返回一个包含所有自身属性(不包含继承属性)的数组。(类似于 Object.keys(), 但不会受enumerable影响).

Reflect.preventExtensions()

类似于 Object.preventExtensions()。返回一个Boolean。

Reflect.set()

将值分配给属性的函数。返回一个Boolean,如果更新成功,则返回true。

Reflect.setPrototypeOf()

类似于 Object.setPrototypeOf()。

标题:reflect,reflects
链接:https://www.7kxz.com/news/rj/49199.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
做超声检查时,医生为什么要在患者肚子上涂粘粘的东西

做B超为什么要涂凝胶?在支付宝蚂蚁庄园每日一题中,2021年4月9日的问题是问做超声检查时,医生为什么要在患者肚

2024-12-14
小米mix fold有前置摄像头吗

小米mix fold有前置摄像头吗?作为小米的第一款折叠屏手机,这款手机可以说实话非常的强大,但是很多网友还是想要

2024-12-14
蚂蚁庄园4月10日答案最新

蚂蚁庄园4月10日答案最新是什么?在支付宝蚂蚁庄园每日一题中,你知道蚂蚁庄园2021年4月10日答案是什么吗?该怎么

2024-12-14
蚂蚁庄园4月13日答案最新

支付宝蚂蚁庄园今日答题答案是什么?在支付宝蚂蚁庄园每日一题中,每天都会刷新出现多个题目等待大家来回答,回答

2024-12-14