本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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之后,会感觉这个很好用,不过在工作中,几乎没有用到过这个方法。如果大佬们遇到过可以下面评论呀。