javascript基础系列之Reflect

Reflect 提供了拦截Javascript操作的方法,只有静态属性和方法。为了逐步替换掉js引擎提供的全局操作符,如delete, in等操作符

静态方法

Reflect.apply

1
2
// Reflect.apply(target, thisArgument, argumentsList)  target表示目标函数,thisArgument表示执行上下文,argumentsList表示给目前函数的参数列表
console.log(Reflect.apply("".indexOf, "hello world", ['e'])); // 1

Reflect.construct

1
2
3
4
5
6
// Reflect.construct(target, argumentsList[, newTarget]) 相当于运行new Target(...args) target表示目标构造函数,argumentsList表示目标函数的参数列表
function Parent() {}
const args = [5,6,7];
const p1 = new Parent(...args);
const p2 = Reflect.construct(Parent, args)
console.log(p1.constructor === p2.constructor); // true, p1,p2指向同一个构造函数

Reflect.defineProperty

1
2
3
4
5
6
// Reflect.defineProperty 和Object.definedProperty类似,设置对象自定义属性
let obj = {}
Reflect.defineProperty(obj, "a", {
value: 1
});
console.log(obj.a); // 1

Reflect.deleteProperty

1
2
3
4
5
6
7
// Reflect.deleteProperty 和delete操作符类似,用于删除对象属性,返回boolean值
let obj = {
a: 1,
b: 2
}
Reflect.deleteProperty(obj, "b");
console.log(obj); // {a: 1s}

Reflect.getOwnPropertyDescriptor

1
2
3
// Reflect.getOwnPropertyDescriptor 返回参数的属性描述符, 否则返回undefined, 与Object.getOwnPropertyDescriptor类似
let obj = { a: 1};
console.log(Reflect.getOwnPropertyDescriptor(obj, 'a')); // {value: 1, writable: true, enumerable: true, configurable: true}

Reflect.has

1
2
3
// Reflect.has 返回对是否存在某个属性,和in操作符相同
const obj1 = { a: 1};
console.log(Reflect.has(obj, "a")); // true

Reflect[isExtensible|preventExtensions]

1
2
3
4
5
6
// Reflect.isExtensible 判断对象是否可扩展, 和Object.isExtensible
// Reflect.preventExtensions 阻止对象扩展新属性 和Object.preventExtensions
const empty = {};
console.log(Reflect.isExtensible(empty)); // true
Reflect.preventExtensions(empty); // 不允许empty对象扩展
console.log(Reflect.isExtensible(empty)); // false

Reflect.ownKeys

1
2
3
4
5
6
// Reflect.ownKeys 返回一个包含自身所有属性键名的数组(不包含继承的)
let obj = {
a: 1,
b: 2
}
console.log(Reflect.ownKeys(obj)); //[‘a’, 'b']

Reflect[set|get]

1
2
3
4
5
6
7
8
// Reflect.set 设置对象属性
// Reflect.get 读取对象属性
let obj = {a: 1, b: 2};
console.log(Reflect.get(obj, "b")); // 2
let arr = ['a','b', 'c'];
console.log(Reflect.get(arr, 1)); // b
Reflect.set(obj, "c", 3);
console.log(obj); // {a:1,b:2,c:3}

Reflect.getPrototypeOf

1
2
3
4
5
6
7
8
// Reflect.getPrototypeOf 返回对象的原型, [[prototype]]值,类似Object.getPrototypeOf
const obj = { a: 1};
const proto = Reflect.getPrototypeOf(obj);
console.log(proto); // [[Prototype]]: Object对象
console.log(Reflect.getPrototypeOf(proto)); // null,原型链终点
const obj2 = { b: 1};
Reflect.setPrototypeOf(obj, obj2); // 设置obj的原型为obj2
console.log(obj.__proto__ === obj2); // true
参考文档

Reflect