Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与
proxy handlers (en-US)的方法相同。Reflect
不是一个函数对象,因此它是不可构造的。
默认调用 | 功能 |
Reflect.get(target, key, receiver) | 对象属性的读取 |
Reflect.set(target, key, value, receiver) | 对象属性的设置 |
Reflect.deleteProperty(target, key) | 删除对象上的属性 |
Reflect.ownKeys(target) | 返回由目标对象自身的属性键组成的数组 |
Reflect.getOwnPropertyDescriptor(target, key) | 获取给定属性的属性描述符 |
Reflect.defineProperty(target, propKey, propDesc) | 定义或修改一个对象的属性 |
Reflect.preventExtensions(target) | 阻止新属性添加到对象 |
Reflect.getPrototypeOf(target) | 获取指定对象原型的函数 |
Reflect.isExtensible(target) | 判断一个对象是否可扩展 |
Reflect.setPrototypeOf(target, proto) | 设置或改变对象原型的函数 |
Reflect.apply(target, object, args) | 对一个函数进行操作,同事可以传入一个数组作为调用参数 |
Reflect.construct(target, args) | 对构造函数进行new操作,实现创建类的实例 |
说明:判断一个对象是否存在某个属性,和 in 运算符的功能完全相同。
- //语法: Reflect.has(target, propertyKey):判断一个对象是否存在某个属性,
- 和 in 运算符的功能完全相同。
- const sum = {
- name:"张三",
- age:18
- }
- console.log(Reflect.has(sum,"age")) //true
- console.log(Reflect.has(sum,"hobby")) //false
语法:静态 Reflect.deleteProperty() 方法允许删除属性。它就像 作为函数 的delete运算符。
- //语法:静态 Reflect.deleteProperty() 方法允许删除属性。
- 它就像 作为函数 的delete运算符。
- const object1 = {
- property1: 42,
- property2: 43,
- };
-
- Reflect.deleteProperty(object1, 'property1');
- // 返回值:Boolean 值表明该属性是否被成功删除。
- console.log(object1); //{property2: 43}
判断一个对象是否可扩展(即是否能够添加新的属性)。与它 Object.isExtensible() 方法相似,但
有一些不同。
静态方法 Reflect.preventExtensions(object1)返回一个 Boolean 值表明目标对象是否成功被设置
为不可扩展。
- /*
- 静态方法 Reflect.isExtensible() 判断一个对象是否可扩展(即是否能够添加新的属性)。
- 与它 Object.isExtensible() 方法相似,但有一些不同。
- */
- const object1 = {};
- console.log(Reflect.isExtensible(object1));//true(返回值为true说明可扩展)
-
-
- /*
- 静态方法 Reflect.preventExtensions(object1)返回一个 Boolean 值表明目标对象是
- 否成功被设置为不可扩展。
- */
- Reflect.preventExtensions(object1);
- console.log(Reflect.isExtensible(object1));//打印false,表明对象现在不可扩展
- /*
- 静态方法 Reflect.defineProperty() 基本等同于 Object.defineProperty() 方法,
- 唯一不同是返回 Boolean 值。
- 语法:Reflect.defineProperty(target, propertyKey, attributes)
- target:目标对象
- propertyKey:要定义或修改的属性的名称
- attributes:要定义或修改的属性的描述。
- 返回值:Boolean 值指示了属性是否被成功定义。如果target不是 Object,抛出一个 TypeError。
- */
- let obj = {}
- const a = Reflect.defineProperty(obj,'x',{
- // get(){
- // return 7
- // }
- value:7
- })
- console.log(a) //true
静态方法 Reflect.getOwnPropertyDescriptor() 与 Object.getOwnPropertyDescriptor() 方法相似。
如果在对象中存在,则返回给定的属性的属性描述符。否则返回 undefined。
- /*
- 静态方法 Reflect.getOwnPropertyDescriptor() 与 Object.getOwnPropertyDescriptor() 方法相似。如果在对象中存在,则返回给定的属性的属性描述符。否则返回 undefined。
- 语法:Reflect.getOwnPropertyDescriptor(target, propertyKey)
- 参数:
- target 需要寻找属性的目标对象。
- propertyKey 获取自己的属性描述符的属性的名称。
- */
- let obj1 = {foo:123}
- const sum = Reflect.getOwnPropertyDescriptor(obj1, 'foo')
- console.log(sum) //{value: 123, writable: true, enumerable: true, configurable: true}
静态方法 Reflect.getPrototypeOf() 与 Object.getPrototypeOf() 方法几乎是一样的。
都是返回指定对象的原型(即内部的 [[Prototype]] 属性的值)。
- /*
- 静态方法 Reflect.getPrototypeOf() 与 Object.getPrototypeOf() 方法几乎是一样的。
- 都是返回指定对象的原型(即内部的 [[Prototype]] 属性的值)。
- */
- const object2 = { property1: 42 };
- const proto1 = Reflect.getPrototypeOf(object2);
- console.log(proto1); //打印object的原型
- const proto12 = Reflect.getPrototypeOf(proto1);
- console.log(proto12) //null
静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。
- /*
- Reflect.ownKeys()
- 静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。
- */
- //如果是一个对象
- let obj3 = {name:'张三',age:18,hobby:['打球','玩游戏']}
- const a1 = Reflect.ownKeys(obj3)
- console.log(a1)//name,age,hobby
Reflect.get()方法与从 对象 (target[propertyKey]) 中读取属性类似,
但它是通过一个函数执行来操作的。
- /*
- Reflect.get()方法与从 对象 (target[propertyKey]) 中读取属性类似,
- 但它是通过一个函数执行来操作的。
- */
- let obj4 = {x:1,y:2}
- const a2 = Reflect.get(obj4,'x')
- console.log(a2) //1
静态方法 Reflect.set() 工作方式就像在一个对象上设置一个属性。
- /*
- 静态方法 Reflect.set() 工作方式就像在一个对象上设置一个属性。
- 语法:
- Reflect.set(target, propertyKey, value)
- target:设置属性的目标对象。
- propertyKey:设置的属性的名称。
- value:添加属性的值
- */
- let obj5 = {}
- Reflect.set(obj5, "prop", "value");