在 ES6 中,Reflect 是一个全局对象,提供了一系列静态方法,用于操作对象。Reflect 的方法与一些对象的方法具有一一对应的关系,同时也提供了一些不属于对象的方法。Reflect 的出现,使得一些操作变得更加规范和易于理解,同时也提供了一些新的功能。哈士奇将在这里介绍 Reflect 的一些常用方法和用法等等。
优点
- 规范性:
Reflect方法的命名和行为更加规范,使得代码更易读、易懂。 - 可控性:
Reflect提供了一些操作的更多控制选项,如通过Reflect.set设置属性值时,可以指定接收器对象。 - 功能性:
Reflect提供了一些新的功能,如通过Reflect.construct可以更灵活地创建实例对象。
特性
- 静态方法:
Reflect的方法都是静态方法,需要通过Reflect.methodName的方式调用。 - 一一对应:
Reflect的方法与一些对象的方法具有一一对应的关系,如Reflect.get对应于对象的obj[property]访问方式。
应用场景
- 代理对象:
Reflect方法经常与代理对象一起使用,用于捕获和定义代理对象的行为。 - 属性操作:
Reflect的属性操作方法如get、set、has、deleteProperty可以用于更规范地操作对象的属性。 - 函数调用:
Reflect.apply方法可以用于更灵活地调用函数。
所有静态方法
1. Reflect.apply(target, thisArgument, argumentsList)
- 用法:用于调用目标函数,并传入指定的参数。
- 优势:提供了更多的控制选项,如可以指定调用函数时的
this值和参数列表。 - 示例:
function add(x, y) {
return x + y;
}
const result = Reflect.apply(add, null, [1, 2]);
console.log(result); // 3
2. Reflect.construct(target, argumentsList[, newTarget])
- 用法:用于创建一个新的实例对象。
- 优势:提供了更灵活的创建实例对象的方式,可以指定构造函数和参数。
- 示例:
class MyClass {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
const obj = Reflect.construct(MyClass, [1, 2]);
console.log(obj instanceof MyClass); // true
console.log(obj.x); // 1
console.log(obj.y); // 2
3. Reflect.defineProperty(target, propertyKey, attributes)
- 用法:用于定义对象的属性。
- 优势:与
Object.defineProperty类似,但提供了更多的返回值和错误处理。 - 示例:
const obj = {};
Reflect.defineProperty(obj, 'x', { value: 1, writable: true });
console.log(obj.x); // 1
4. Reflect.deleteProperty(target, propertyKey)
- 用法:用于删除对象的属性。
- 优势:与
delete操作符类似,但提供了更多的返回值和错误处理。 - 示例:
const obj = { x: 1 };
Reflect.deleteProperty(obj, 'x');
console.log(obj.x); // undefined
5. Reflect.get(target, propertyKey[, receiver])
- 用法:用于获取对象的属性值。
- 优势:与直接访问属性的方式相比,提供了更多的返回值和错误处理。
- 示例:
const obj = { x: 1 };
console.log(Reflect.get(obj, 'x')); // 1
6. Reflect.has(target, propertyKey)
- 用法:用于判断对象是否具有某个属性。
- 优势:与
in操作符类似,但提供了更多的返回值和错误处理。 - 示例:
const obj = { x: 1 };
console.log(Reflect.has(obj, 'x')); // true
7. Reflect.isExtensible(target)
- 用法:用于判断对象是否可扩展。
- 优势:与
Object.isExtensible类似,但提供了更多的返回值和错误处理。 - 示例:
const obj = {};
console.log(Reflect.isExtensible(obj)); // true
8. Reflect.ownKeys(target)
- 用法:用于获取对象自身的属性键。
- 优势:与
Object.getOwnPropertyNames和Object.getOwnPropertySymbols的组合效果相同,但提供了更多的返回值和错误处理。 - 示例:
const obj = { x: 1, [Symbol('y')]: 2 };
console.log(Reflect.ownKeys(obj)); // ['x', Symbol(y)]
9. Reflect.preventExtensions(target)
- 用法:用于使对象变为不可扩展。
- 优势:与
Object.preventExtensions类似,但提供了更多的返回值和错误处理。 - 示例:
const obj = {};
Reflect.preventExtensions(obj);
console.log(Reflect.isExtensible(obj)); // false
10. Reflect.set(target, propertyKey, value[, receiver])
- 用法:用于设置对象的属性值。
- 优势:与直接设置属性的方式相比,提供了更多的返回值和错误处理。
- 示例:
const obj = {};
Reflect.set(obj, 'x', 1);
console.log(obj.x); // 1
11. Reflect.setPrototypeOf(target, prototype)
- 用法:用于设置对象的原型。
- 优势:与
Object.setPrototypeOf类似,但提供了更多的返回值和错误处理。 - 示例:
const obj = {};
const proto = { x: 1 };
Reflect.setPrototypeOf(obj, proto);
console.log(obj.x); // 1
实际案例
// 使用 Reflect.get 获取对象属性值
const obj = { x: 1 };
console.log(Reflect.get(obj, 'x')); // 1
// 使用 Reflect.set 设置对象属性值
Reflect.set(obj, 'y', 2);
console.log(obj.y); // 2
// 使用 Reflect.has 判断对象是否具有属性
console.log(Reflect.has(obj, 'x')); // true
console.log(Reflect.has(obj, 'z')); // false
// 使用 Reflect.deleteProperty 删除对象属性
Reflect.deleteProperty(obj, 'x');
console.log(obj.x); // undefined
// 使用 Reflect.construct 创建实例对象
class MyClass {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
const instance = Reflect.construct(MyClass, [1, 2]);
console.log(instance instanceof MyClass); // true
console.log(instance.x); // 1
console.log(instance.y); // 2
// 使用 Reflect.apply 调用函数
function add(x, y) {
return x + y;
}
const result = Reflect.apply(add, null, [1, 2]);
console.log(result); // 3
总结
Reflect 对象提供了一系列静态方法,用于操作对象。它的方法与一些对象的方法具有一一对应的关系,同时也提供了一些不属于对象的方法。Reflect 的出现,使得一些操作变得更加规范和易于理解,同时也提供了一些新的功能。
假如您也和我一样,在准备春招。欢迎加我微信 shunwuyu ,这里有几十位一心去大厂的友友可以相互鼓励,分享信息,模拟面试,共读源码,齐刷算法,手撕面经。来吧,友友们!