方法
一、Reflect.apply()
静态方法Reflect.apply()通过指定的参数列表发起对目标(target)函数的调用。该方法与ES5中Function.prototype.apply()方法类似:调用一个方法并且显式地指定this变量和参数列表(arguments) ,参数列表可以是数组,或类似数组的对象。
语法
Reflect.apply(target, thisArgument, argumentsList)
- target: 目标函数
- thisArgument: target函数调用时绑定的this对象
- argumentsList: target函数调用时传入的实参列表,该参数应该是一个类数组的对象
返回值
返回值是调用完带着指定参数和this值的给定的函数后返回的结果。
应用场景
-
调用
Math
方法调用 Math.floor()const num = Reflect.apply(Math.floor,undefined,[1.75]);
console.log(num); // 1调用 Math.max()const array = [10,20,30,40,50,60,70];
const result = Reflect.apply(Math.max,undefined,array);
console.log(result); // 70
二、Reflect.construct()
Reflect.construct()方法的行为有点像new操作符 构造函数 , 相当于运行new target(...args)
.
语法
Reflect.construct(target, argumentsList[, newTarget])
- target: 被运行的目标构造函数
- argumentsList: 类数组,目标构造函数调用时的参数。
- newTarget: 作为新创建对象的原型对象的constructor属性, 参考 new.target 操作符,默认值为target。
返回值
以target(如果newTarget存在,则为newTarget)函数为构造函数,argumentList为其初始化参数的对象实例。
应用场景
-
同
new
、Object.create()
一样创建对象通过 new 创建对象,如果不使用 new 调用构造函数,构造函数内部的 new.target 值会自动指向 undefinedfunction Person(name,age){
this.name = name;
this.age = age;
}
const person = new Person('柏拉图',23);
console.log(person); // Person {name: '柏拉图', age: 23}通过 Object.create() 创建对象const obj = {
name:'柏拉图',
age:23
}
const objCopy = Object.create(obj,{
name:{
value:'objCopy 柏拉图',
writable:true,
enumerable:true,
configurable:true
},
age:{
value:'objCopy 23',
writable:true,
enumerable:true,
configurable:true
}
});
console.log(objCopy); // {name: 'objCopy 柏拉图', age: 'objCopy 23'}通过 Reflect.construct() 创建对象, new.target 值自动指向到 targetfunction Person(name,age){
this.name = name;
this.age = age;
}
function Animal(color){
this.color = color;
}
const person = Reflect.construct(Person,['柏拉图',23]);
console.log(person);
三、Reflect.defineProperty()
静态方法Reflect.defineProperty()基本等同于Object.defineProperty()方法,唯一不同是返回Boolean值。
语法
Reflect.defineProperty(target, propertyKey, attributes)
- target: 目标对象
- propertyKey: 要定义或修改的属性的名称
- attributes: 要定义或修改的属性的描述
返回值
Boolean 值指示了属性是否被成功定义。
应用场景
-
通过
Object.defineProperty()
和Reflect.defineProperty()
精确添加或修改对象上的属性通过 Object.defineProperty() 管理对象属性const obj = {};
const resultName = Object.defineProperty(obj,'name',{
value:'柏拉图',
writable:true,
enumerable:true,
configurable:true
});
console.log(resultName); // {name: '柏拉图'}
const resultAge = Object.defineProperty(obj,'age',{
value:'年龄',
writable:true,
enumerable:true,
configurable:true
});
console.log(resultAge); // {name: '柏拉图', age: '年龄'}
console.log(obj); // {name: '柏拉图', age: '年龄'}通过 Reflect.defineProperty() 管理对象属性const obj = {};
const resultName = Reflect.defineProperty(obj,'name',{
value:'柏拉图',
writable:true,
enumerable:true,
configurable:true
});
console.log(resultName); // true
const resultAge = Reflect.defineProperty(obj,'age',{
value:'年龄',
writable:true,
enumerable:true,
configurable:true
});
console.log(resultAge); // true
console.log(obj); // {name: '柏拉图', age: '年龄'}
四、Reflect.deleteProperty()
静态方法Reflect.deleteProperty()允许用于删除属性。它很像delete operator,但它是一个函数。
语法
Reflect.deleteProperty(target, propertyKey)
- target: 删除属性的目标对象
- propertyKey: 需要删除的属性的名称
返回值
Boolean 值表明该属性是否被成功删除
应用场景
-
通过
delete
操作符或者Reflect.delete()
删除对象属性通过 delete 删除对象属性const obj = {
name:'柏拉图',
age:23
}
delete obj.name;
console.log(obj); // {age: 23}通过 Reflect.delete() 删除对象属性const obj = {
name:'柏拉图',
age:23
}
Reflect.deleteProperty(obj,'name');
console.log(obj); // {age: 23}
五、Reflect.get()
**Reflect.get()**方法与从 对象 (target[propertyKey]) 中读取属性类似,但它是通过一个函数执行来操作的。
语法
Reflect.get(target, propertyKey[, receiver])
- target: 需要取值的目标对象
- propertyKey: 需要获取的值的键值
- receiver: 如果target对象中指定了getter,receiver则为getter调用时的this值。
返回值
属性的值。
应用场景
-
通过
ojb/数组[属性名/索引]
或者Reflect.get(对象/数组,属性名/索引)
访问对象/数组属性/元素通过 ojb/数组[属性名/索引] 访问对象/数组属性/元素const obj = {
name:'柏拉图',
age:23
}
const array = [10,20,30,40,50];
const resultObjName = obj['name'];
const resultArray1 = array[1];
console.log(resultObjName); // 柏拉图
console.log(resultArray1); // 20通过 Reflect.get(对象/数组,属性名/索引) 访问对象/数组属性/元素const obj = {
name:'柏拉图',
age:23
}
const array = [10,20,30,40,50];
const resultObjName = Reflect.get(obj,'name');
const resultArray1 = Reflect.get(array,1);
console.log(resultObjName); // 柏拉图
console.log(resultArray1); // 20
六、Reflect.getOwnPropertyDescriptor()
静态方法**Reflect.getOwnPropertyDescriptor()与Object.getOwnPropertyDescriptor()方法相似。如果在对象中存在,则返回给定的属性的属性描述符。否则返回 undefined。 与Object.getOwnPropertyDescriptor()**的唯一不同在于如何处理非对象目标。如果该方法的第一个参数不是一个对象(原始值),那么将造成一个 TypeError 异常。对于 Object.getOwnPropertyDescriptor(),非对象的第一个参数会被强制转换为一个对象。 语法
Reflect.getOwnPropertyDescriptor(target, propertyKey)
- target: 需要寻找属性的目标对象。
- propertyKey: 获取自己的属性描述符的属性的名称。
返回值
如果属性存在于给定的目标对象中,则返回属性描述符;否则,返回 undefined。
应用场景
-
通过
Object.getOwnPropertyDescriptor
或者Reflect.getOwnPropertyDescriptor
获取对象自身属性描述符通过 Object.getOwnPropertyDescriptor 获取对象自身属性的描述符const obj = {
name:'柏拉图',
age:23
}
const array = [10,20,30,40,50];
const resultObjName = Object.getOwnPropertyDescriptor(obj,'name');
const resultArray1 = Object.getOwnPropertyDescriptor(array,1);
console.log(resultObjName); // {value: '柏拉图', writable: true, enumerable: true, configurable: true}
console.log(resultArray1); // {value: 20, writable: true, enumerable: true, configurable: true}通过 Reflect.getOwnPropertyDescriptor 获取对象自身属性的描述符const obj = {
name:'柏拉图',
age:23
}
const array = [10,20,30,40,50];
const resultObjName = Reflect.getOwnPropertyDescriptor(obj,'name');
const resultArray1 = Reflect.getOwnPropertyDescriptor(array,1);
console.log(resultObjName); // {value: '柏拉图', writable: true, enumerable: true, configurable: true}
console.log(resultArray1); // {value: 20, writable: true, enumerable: true, configurable: true} -
通过
Object.getOwnPropertyDescriptor
或者Reflect.getOwnPropertyDescriptor
处理非对象时各自的表现