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操作,实现创建类的实例 |
Reflect语法之一:Reflect.has(target, propertyKey)
说明:判断一个对象是否存在某个属性,和 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语法之二:Reflect.deleteProperty(object, 'property')
语法:静态 Reflect.deleteProperty() 方法允许删除属性。它就像 作为函数 的delete运算符。
//语法:静态 Reflect.deleteProperty() 方法允许删除属性。
它就像 作为函数 的delete运算符。
const object1 = {
property1: 42,
property2: 43,
};
Reflect.deleteProperty(object1, 'property1');
// 返回值:Boolean 值表明该属性是否被成功删除。
console.log(object1); //{property2: 43}
Reflect语法之三:Reflect.isExtensible()
判断一个对象是否可扩展(即是否能够添加新的属性)。与它 Object.isExtensible() 方法相似,但
有一些不同。
Reflect语法之四: Reflect.preventExtensions(object1)
静态方法 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语法之五:
Reflect.defineProperty(target,propertyKey,attributes)
/*
静态方法 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语法之六:
Reflect.getOwnPropertyDescriptor(target, propertyKey)
静态方法 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语法之七:Reflect.getPrototypeOf()
静态方法 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语法之八:Reflect.ownKeys()
静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。
/*
Reflect.ownKeys()
静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。
*/
//如果是一个对象
let obj3 = {name:'张三',age:18,hobby:['打球','玩游戏']}
const a1 = Reflect.ownKeys(obj3)
console.log(a1)//name,age,hobby
Reflect语法之九:Reflect.get()
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语法之十:Reflect.set()
静态方法 Reflect.set() 工作方式就像在一个对象上设置一个属性。
/*
静态方法 Reflect.set() 工作方式就像在一个对象上设置一个属性。
语法:
Reflect.set(target, propertyKey, value)
target:设置属性的目标对象。
propertyKey:设置的属性的名称。
value:添加属性的值
*/
let obj5 = {}
Reflect.set(obj5, "prop", "value");