Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ES6 - Reflect #40

Open
jtwang7 opened this issue Oct 6, 2021 · 0 comments
Open

ES6 - Reflect #40

jtwang7 opened this issue Oct 6, 2021 · 0 comments

Comments

@jtwang7
Copy link
Owner

jtwang7 commented Oct 6, 2021

参考文章:

Reflect 对象设计目的

Reflect 对象是 ES6 为操作对象而提供的新 API。在此之前,有关对象的操作大多涉及 Object 构造函数方法的调用,而 Reflect 对象的提出,其主要目的就是将关于对象的操作从 Object 上单独提取出来。
它有以下几个设计目的:

  1. 将 Object 对象的一些明显属于语言内部的方法(比如 Object.defineProperty),放到 Reflect 对象上。

现阶段,某些方法同时在 Object 和 Reflect 对象上部署,未来的新方法将只部署在 Reflect 对象上。

  1. 修改某些 Object 方法的返回结果,让其变得更合理:比如,Object.defineProperty(obj, name, desc) 在无法定义属性时,会抛出一个错误,而 Reflect.defineProperty(obj, name, desc) 则会返回 false。
  2. 让 Object 操作都变成函数行为:某些 Object 操作是命令式,比如 name in objdelete obj[name],而 Reflect.has(obj, name)Reflect.deleteProperty(obj, name) 让它们变成了函数行为。
  3. Reflect 对象保存并向 Proxy 对象提供了对象操作的默认行为:Reflect 对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。这就让Proxy对象可以方便地调用对应的Reflect方法,完成默认行为,作为修改行为的基础。也就是说,不管Proxy怎么修改默认行为,你总可以在Reflect上获取默认行为。

Reflect 对象的 13 个静态方法

注意:下述 Reflect 对象方法中,target 需要传入对象类型,因为 Reflect 本身就是关于对象的操作,若 target 不是对象类型,调用方法时会报错。

  • Reflect.apply(target, thisArg, args)

    • Function.prototype.apply.call() 的替代写法,当函数自定了自己的 apply 方法时使用
  • Reflect.construct(target, args)

    • 等同于 new Fn(...args),提供了一种不使用 new 来调用构造函数的方法。即上文提到的命令式操作行为统一函数化。
  • Reflect.get(target, name, receiver)

    • 查找并返回 target 对象的 name 属性,receiver 用于绑定方法执行时的 this 指向
    • 若没有该属性,则返回 undefined
  • Reflect.set(target, name, value, receiver)

    • 设置 target 对象的 name 属性等于 value,receiver 用于绑定方法执行时的 this 指向
  • Reflect.defineProperty(target, name, desc)

    • 等同于 Object.defineProperty(),为对象定义属性。后者将在未来被废除。
    • Reflect.set() 不同在于,Reflect.defineProperty() 可定义更加详细的描述对象 description
  • Reflect.deleteProperty(target, name)

    • 等同于 delete obj[name],用于删除对象的属性
    • 方法返回一个布尔值,若删除成功或者被删除的属性不存在,则返回 true
  • Reflect.has(target, name)

    • 等同于 in 运算符,用于查找 target 对象中 name 属性是否存在
  • Reflect.ownKeys(target)

    • 返回目标对象的所有属性,基本等同于 Object.getOwnPropertyNames + Object.getOwnPropertySymbols
  • Reflect.isExtensible(target)

    • 返回一个布尔值,表示当前对象是否可扩展
  • Reflect.preventExtensions(target)

    • 使一个对象不可扩展,返回一个布尔值,表示是否操作成功
  • Reflect.getOwnPropertyDescriptor(target, name)

    • 用于获取指定属性的描述对象
    • 基本等同于 Object.getOwnPropertyDescriptor(),区别在于 Object.getOwnPropertyDescriptor() 接收第一个参数不是对象时,不会报错而是返回 undefined;Reflect.getOwnPropertyDescriptor() 会抛出错误
  • Reflect.getPrototypeOf(target)

    • 读取对象的 [[Prototype]] 属性
    • 规范化了浏览器通过 proto 属性获取对象原型的方式
  • Reflect.setPrototypeOf(target, prototype)

    • 设置对象的 [[Prototype]] 属性,返回修改后的第一个参数对象 (即在原对象上修改)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant