JavaScript的es6新增Reflect

128 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

reflect的中文翻译是反射。

一、reflect是什么?

MDN: Reflect是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与proxy handlers (en-US)的方法相同。Reflect不是一个函数对象,因此它是不可构造的。

总结:Reflect对象提供了很多操作js对象的方法,比如增删改等。与Object提供的方法类似。 一般与Proxy配合使用。

reflect的使用

const obj = { name: "www", age: 22 };
 
const objProxy = new Proxy(obj, {
  get(target, key) {
    // return target[key]
    return Reflect.get(target, key);
  },
  set(target, key, newValue) {
    // target[key] = newValue;
    let res = Reflect.set(target, key, newValue);
    console.log(res);//会返回设置结果
  },
});
 
console.log(objProxy);
objProxy.name = "hhh";

为什么需要Reflect

  • 早期的ECMA规范中没有考虑到对对象本地操作如何设计会更规范,所以将这些方法API放到了Object上
  • Object作为一个构造函数,这些放到他身上不合适
  • 还包含一下类似于in、delete操作符,让js看起来有点奇怪

与Object方法的区别

可参考比较 Reflect 和 Object 方法 - JavaScript | MDN

Reflect的常用方法

  • Reflect.apply()

    • 对一个函数进行调用操作,同时可以传入一个数组作为调用参数。
  • Reflect.construct(target, argumentsList[, newTarget])

    • 对构造函数进行new操作
  • Reflect.defineProperty(target, propertyKey, attributes)

    • Object.defineProperty()
  • Reflect.deleteProperty(target, propertyKey)

    • Object.preventExtensions() 阻止对象添加属性
  • Reflect.get(target, propertyKey[, receiver])

    • 获取对象的属性
  • Reflect.getOwnPropertyDescriptor(target, propertyKey)

    • Object.getOwnPropertyDescriptor()
  • Reflect.getPrototypeOf(target)

    • Object.getPrototypeOf()
  • Reflect.has(target, propertyKey)

    • Object.isExtensible()
  • Reflect.ownKeys(target)

    • Object.keys()
  • Reflect.preventExtensions(target)

    • Object.preventExtensions()
  • Reflect.set(target, propertyKey, value[, receiver])

    • 设置对象属性
  • Reflect.setPrototypeOf(target, prototype)

    • 设置对象的原型

Reflect.construct()的使用、

const stu = new Student("ww", 32);
console.log(stu);
console.log(stu.__proto__ === Student.prototype);
 
// 执行Student函数,创建出来的对象是Teacher对象
const tea = Reflect.construct(Student, ["wwww", 22], Teacher);
console.log(tea);
console.log(tea.__proto__ === Teacher.prototype);

写在最后:学了reflect之后,会感觉这个很好用,不过在工作中,几乎没有用到过这个方法。如果大佬们遇到过可以下面评论呀。