赞
踩
目录
Reflect是 ECMAScript 6 (ES6) 引入的一个内置对象,它提供了一套与 JavaScript 内置操作直接对应的、用于对象操作的静态方法。
这些方法的设计目的是为了使操作对象的行为变得更为清晰、更易于使用,并且在某些情况下提供更好的错误处理机制。
Reflect 对象的方法与Object对象上的同名方法(如get、set、defineProperty等)相对应,但它们通常返回一个布尔值以表示操作是否成功,而不是静默失败。
1、Reflect.get(target, propertyKey[, receiver]):获取目标对象target上指定属性propertyKey的值。
2、Reflect.set(target, propertyKey, value[, receiver]):设置目标对象target上指定属性propertyKey的值为value
3、Reflect.defineProperty(target, propertyKey, attributes):类似于Object.defineProperty(),在目标对象上定义一个属性,返回一个布尔值表示是否成功。
4、Reflect.deleteProperty(target,propertyKey):类似于delete运算符,尝试删除目标对象上的指定属性。
5、Reflect.apply(target, thisArgument, argumentsList):类似于Function.prototype.apply(),调用目标函数,并将argumentsList作为参数传递。
6、Reflect.construct(target, argumentsList[, newTarget]):类似于new操作符,使用给定的参数列表argumentsList调用构造函数target并创建一个新实例。
7、Reflect.has(target, propertyKey):检查目标对象target是否具有指定的属性propertyKey。
8、Reflect.ownKeys(target):返回一个数组,包含目标对象target自身的所有属性键(包括可枚举和不可枚举的属性,以及符号属性)。
9、Reflect.isExtensible(target):判断目标对象target是否可扩展(即是否可以添加新属性)。返回一个布尔值。
10、Reflect.preventExtensions(target):阻止目标对象target扩展(不能再添加新属性)。返回一个布尔值,表示操作是否成功。
11、Reflect.getPrototypeOf(target):返回目标对象target的原型(即[[Prototype]])。相当于Object.getPrototypeOf()。
12、Reflect.setPrototypeOf(target, prototype):设置目标对象target的原型(即[[Prototype]])为prototype。
13、Reflect.getOwnPropertyDescriptor(target, propertyKey):返回目标对象target上指定属性propertyKey的属性描述符。与Object.getOwnPropertyDescriptor()相似。
14、Reflect.getOwnPropertyNames(target):返回一个数组,包含目标对象target自身所有可枚举的属性名(字符串类型)。
15、Reflect.getOwnPropertySymbols(target):返回一个数组,包含目标对象target自身所有可枚举的符号属性键。
1. Reflect.get(target, propertyKey[, receiver])
获取目标对象target上指定属性propertyKey的值。如果该属性不可访问或不存在,则返回undefined。可选参数receiver用于指定作为this值的对象,当属性为 getter 时有用。
- constobj = { a: 1, b: { c: 2} };
- console.log(Reflect.get(obj, 'a')); // 输出:1
- console.log(Reflect.get(obj, 'b.c')); // 输出:2
2. Reflect.set(target, propertyKey, value[, receiver])
设置目标对象target上指定属性propertyKey的值为value。返回一个布尔值,表示操作是否成功。如果属性不可写或不存在(且对象不可扩展),则返回false。可选参数receiver同样用于指定作为this值的对象。
- constobj = { a: 1};
- constsuccess = Reflect.set(obj, 'a', 2);
- console.log(success); // 输出:true
- console.log(obj.a); // 输出:2
-
- // 对不可扩展对象尝试添加新属性
- constsealedObj = Object.seal({ x: 1}); // Object.seal() 是 ES5 引入的一个方法,用于密封一个对象
- constaddPropResult = Reflect.set(sealedObj, 'y', 2);
- console.log(addPropResult); // 输出:false
3. Reflect.defineProperty(target, propertyKey, attributes)
类似于Object.defineProperty(),在目标对象上定义一个属性,返回一个布尔值表示是否成功。attributes是一个包含属性描述符的对象。
- constobj = {};
- constdescriptor = {
- value: 'hello',
- writable: true,
- enumerable: true,
- configurable: false,
- };
-
- constdefined = Reflect.defineProperty(obj, 'greeting', descriptor);
- console.log(defined); // 输出:true
- console.log(obj.greeting); // 输出:'hello'
4. Reflect.deleteProperty(target, propertyKey)
类似于delete运算符,尝试删除目标对象上的指定属性。返回一个布尔值,表示是否成功删除。
- constobj = { a: 1};
- constdeleted = Reflect.deleteProperty(obj, 'a');
- console.log(deleted); // 输出:true
- console.log(obj.a); // 输出:undefined
5. Reflect.apply(target, thisArgument, argumentsList)
类似于Function.prototype.apply(),调用目标函数,并将argumentsList作为参数传递。thisArgument用于指定函数调用时的this值。
- functionsum(a, b) {
- returna + b;
- }
-
- constargs = [3, 4];
- constresult = Reflect.apply(sum, null, args);
- console.log(result); // 输出:7
6. Reflect.construct(target, argumentsList[, newTarget])
类似于new操作符,使用给定的参数列表argumentsList调用构造函数target并创建一个新实例。可选参数newTarget用于指定构造函数的原型。
- classPerson{
- constructor(name) {
- this.name = name;
- }
- }
-
- constargs = ['Alice'];
- constinstance = Reflect.construct(Person, args);
- console.log(instance instanceofPerson); // 输出:true
- console.log(instance.name); // 输出:'Alice'
7. Reflect.has(target, propertyKey)
检查目标对象target是否具有指定的属性propertyKey。返回一个布尔值。
- constobj = { a: 1, b: 2};
- console.log(Reflect.has(obj, 'a')); // 输出:true
- console.log(Reflect.has(obj, 'c')); // 输出:false
8. Reflect.ownKeys(target)
返回一个数组,包含目标对象target自身的所有属性键(包括可枚举和不可枚举的属性,以及符号属性)。
- constobj = { a: 1, b: 2};
- Object.defineProperty(obj, 'c', { value: 3, enumerable: false});
-
- console.log(Reflect.ownKeys(obj)); // 输出:['a', 'b', 'c']
9. Reflect.isExtensible(target)
判断目标对象target是否可扩展(即是否可以添加新属性)。返回一个布尔值。
- constobj = { a: 1};
- console.log(Reflect.isExtensible(obj)); // 输出:true
-
- Object.preventExtensions(obj); // 阻止对一个对象进一步添加新的属性(不可扩展)
- console.log(Reflect.isExtensible(obj)); // 输出:false
10. Reflect.preventExtensions(target)
阻止目标对象target扩展(不能再添加新属性)。返回一个布尔值,表示操作是否成功。
- constobj = { a: 1};
- console.log(Reflect.preventExtensions(obj)); // 输出:true
- console.log(Reflect.isExtensible(obj)); // 输出:false
-
- // 尝试添加新属性
- obj.b = 2;
- console.log(obj.b); // 输出:undefined,因为对象已不可扩展
11. Reflect.getPrototypeOf(target)
返回目标对象target的原型(即[[Prototype]])。相当于Object.getPrototypeOf()
- classMyClass{}
- constinstance = newMyClass();
-
- console.log(Reflect.getPrototypeOf(instance) === MyClass.prototype); // 输出:true
12. Reflect.setPrototypeOf(target, prototype)
设置目标对象target的原型(即[[Prototype]])为prototype。返回一个布尔值,表示操作是否成功。此操作可能会影响已有属性的查找和继承。
- classBaseClass{}
- classDerivedClassextendsBaseClass{}
-
- constderivedInstance = newDerivedClass();
- console.log(Reflect.getPrototypeOf(derivedInstance) === DerivedClass.prototype); // 输出:true
-
- Reflect.setPrototypeOf(derivedInstance, BaseClass.prototype);
- console.log(Reflect.getPrototypeOf(derivedInstance) === BaseClass.prototype); // 输出:true
13. Reflect.getOwnPropertyDescriptor(target, propertyKey)
返回目标对象target上指定属性propertyKey的属性描述符。与Object.getOwnPropertyDescriptor()相似。
- constobj = { a: 1};
- constdescriptor = Reflect.getOwnPropertyDescriptor(obj, 'a');
-
- console.log(descriptor); // 输出类似:
- // {
- // value: 1,
- // writable: true,
- // enumerable: true,
- // configurable: true
- // }
14. Reflect.getOwnPropertyNames(target)
返回一个数组,包含目标对象target自身所有可枚举的属性名(字符串类型)。
- constobj = { a: 1, b: 2};
- Object.defineProperty(obj, 'c', { value: 3, enumerable: false});
-
- console.log(Reflect.getOwnPropertyNames(obj)); // 输出:['a', 'b']
15. Reflect.getOwnPropertySymbols(target)
返回一个数组,包含目标对象target自身所有可枚举的符号属性键。
- constsymbolA = Symbol('a');
- constsymbolB = Symbol('b');
- constobj = { [symbolA]: 1, [symbolB]: 2};
-
- console.log(Reflect.getOwnPropertySymbols(obj)); // 输出:[Symbol(a), Symbol(b)]
总结来说,Reflect对象提供了一组与 JavaScript 内部操作直接对应的、用于对象操作的标准 API,它增强了代码的可读性、一致性,并且在某些情况下提供了更详细的控制和反馈。
开发人员可以根据需要使用这些方法来替代或配合原有的Object方法及内建操作符进行更精细的对象操作。
作者:吴冬林| 前端开发工程师
版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。
公众号搜索神州数码云基地,了解更多技术干货。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。