描述

Reflect 是一个内置对象,它提供一个拦截 Javascript 操作的方法。与 proxy handlers 方法相同。Reflect不是一个函数对象,因此它是不可构造的(不能使用 new 操作符)。其所有属性和方法都是静态的

Object 基础上的功能,使得对于对象属性和方法的处理更加平滑合理

Reflect.apply()

语法

1
Reflect.apply(target, thisArgument, argumentsList)

参数

target: 目标函数。 thisArgument: target函数调用时绑定的this对象。 argumentsList: target函数调用时传入的实参列表,该参数应该是一个类数组的对象。

返回值

返回值是调用完带着指定参数和 this 值的给定的函数后返回的结果。

异常

如果 target 对象不可调用,抛出 TypeError。

Reflect.construct()

相当于运行 new 操作

语法

1
Reflect.construct(target, argumentsList[, newTarget])

参数

target: 被运行的目标构造函数 argumentsList: 类数组,目标构造函数调用时的参数 newTarget(可选): 作为新创建对象的原型对象的constructor属性, 参考 new.target 操作符,默认值为target。相当于将 new.target 设置为 newTarget; 原型链

返回

以target(如果newTarget存在,则为newTarget)函数为构造函数,argumentList为其初始化参数的对象实例。

Reflect.construct() vs Object.create()

Reflect.construct()Object.create() 操作一致。区别在于 Reflect.construct() 相当于 new 操作,即其 new.target 会指向参数 target 或者 newTarget,但是 Object.create()new.target 指向 undefined

Reflect.defineProperty()

Object.defineProperty 基本相同,区别是该方法返回的是 Boolean。设置成功返回 true,失败返回 false

语法

1
Reflect.defineProperty(target, propertyKey, attributes)

参数

target: 目标对象。 propertyKey: 要定义或修改的属性的名称。 attributes: 要定义或修改的属性的描述。

返回值

Boolean 值指示了属性是否被成功定义。

异常

如果 target 不是 Object,返回 TypeError

描述

参考 Object.defineProperty

Reflect.deleteProperty()

删除一个对象的属性。与 delete operator 在非严格模式相同

delete operator 在非严格模式下,对于自身的不可配置的属性将返回 false; 在严格模式下会抛出 TypeError

语法

1
Reflect.deleteProperty(target, propertyKey)

参数

target:删除属性的目标对象。 propertyKey:需要删除的属性的名称。

返回值

Boolean 表示是否删除成功

异常

对于非 Objecttarget 将抛出 TypeError;

Reflect.ownKeys()

静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。

可以拿到不可枚举的属性,以及Symbol为key的属性

语法

1
Reflect.ownKeys(target)

参数

target:获取自身属性键的目标对象。

返回值

由目标对象的自身属性键组成的 Array

异常

如果目标不是 Object ,抛出一个 TypeError

描述

Reflect.ownKeys 方法返回一个由目标对象自身的属性键组成的数组。它的返回值等同于Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
var o = {};
Object.defineProperty(o, "a", { value : 1, enumerable: true });
Object.defineProperty(o, "b", { value : 2, enumerable: false });
Object.defineProperty(o, "c", { value : 3 }); // enumerable 默认为 false
o.d = 4; // 如果使用直接赋值的方式创建对象的属性,则 enumerable 为 true
Object.defineProperty(o, Symbol.for('e'), {
  value: 5,
  enumerable: true
});
Object.defineProperty(o, Symbol.for('f'), {
  value: 6,
  enumerable: false
});

for (var i in o) {
  console.log(i);
}
// logs 'a' and 'd' (in undefined order)

Object.keys(o); // ['a', 'd']

o.propertyIsEnumerable('a'); // true
o.propertyIsEnumerable('b'); // false
o.propertyIsEnumerable('c'); // false
o.propertyIsEnumerable('d'); // true
o.propertyIsEnumerable(Symbol.for('e')); // true
o.propertyIsEnumerable(Symbol.for('f')); // false

var p = { ...o }
p.a // 1
p.b // undefined
p.c // undefined
p.d // 4
p[Symbol.for('e')] // 5
p[Symbol.for('f')] // undefined

Object.getOwnPropertyNames(o) // ['a', 'b', 'c', 'd']
Object.getOwnPropertySymbols(o) // [Symbol.for(e), Symbol.for(f)]

Reflect.ownKeys(o) // ['a', 'b', 'c', 'd', Symbol.for(e), Symbol.for(f)]