在 JavaScript 中,Reflect 是一个全局对象,是在 ECMAScript 6(ES6)中引入的。它包含了静态方法,提供了在运行时与对象交互的一种更好的方式。
不同于大多数全局对象,Reflect 不是一个构造函数。你不能使用 new
操作符或者将 Reflect 对象作为函数调用。Reflect 所有的方法都是静态的,就像 Math 对象一样。
Reflect 包含了多种方法,可以在运行时访问、更新或删除对象的属性等。
Reflect 对象的关键特性
-
对象构造 — Reflect API 允许使用
Reflect.construct()
方法在运行时创建对象。
-
函数调用 — Reflect API 的
apply()
方法用于通过传递上下文和参数来调用来函数或对象方法。
-
对象属性操作 — Reflect API 提供了不同的方法来设置、更新或删除对象属性。此外,它也可以处理通过防止扩展来扩展对象的情况。
语法
下面展示了使用 Reflect API 方法的一般语法:
Reflect.method();
在上面的语法中,method
是一个泛指。它可以是 Reflect API 的任何方法,例如 get、set、apply、construct、has 等。
Reflect 方法
下表列出了 Reflect 的所有方法:
序号 |
方法 & 描述 |
1 |
apply() |
2 |
construct() |
3 |
defineProperty() |
4 |
deleteProperty() |
5 |
get() |
6 |
getOwnPropertyDescriptor() |
7 |
getPrototypeOf() |
8 |
has() |
9 |
isExtensible() |
10 |
ownKeys() |
11 |
preventExtensions() |
12 |
set() |
13 |
setPrototypeOf() |
示例
示例 1
在下面的示例中,我们定义了一个 car
对象。prop
变量包含了字符串格式的属性名。
我们使用 Reflect 对象的 get()
方法从 car
对象中访问 model
属性。我们将对象名称作为 get()
方法的第一个参数,属性名称作为第二个参数传递。
在输出中,你可以看到 model
属性的值。
<html>
<body>
<div id="output">The model of the car is: </div>
<script>
const car = {
name: "Audi",
model: "Q6",
price: 7000000,
}
let prop = "model";
let model = Reflect.get(car, prop);
document.getElementById("output").innerHTML += model;
</script>
</body>
</html>
输出:
The model of the car is: Q6
示例 2
在下面的示例中,我们使用了 set()
方法来设置对象中的属性。set()
方法接受一个对象、属性名以及值作为参数。
输出显示了 doors
属性的值。这样,你可以使用 Reflect API 的 set()
方法在运行时设置对象的属性。
<html>
<body>
<div id="output">The total doors in the Audi Q6 is: </div>
<script>
const car = {
name: "Audi",
model: "Q6",
price: 7000000,
}
const model = Reflect.set(car, "doors", 4);
document.getElementById("output").innerHTML += car.doors;
</script>
</body>
</html>
输出:
The total doors in the Audi Q6 is: 4
执行上述脚本后,输出窗口将弹出,在网页上显示文本。
示例 3
在下面的示例中,我们使用了 has()
方法来动态地检查某个特定属性是否存在于对象中。
两个符号看起来相似但实际上是不同的,这在输出中可以看到。
<html>
<body>
<p id="output"></p>
<script>
const car = {
name: "Audi",
model: "Q6",
price: 7000000,
}
const isName = Reflect.has(car, "name");
if (isName) {
document.getElementById("output").innerHTML = "The Car object contains the name.";
}
</script>
</body>
</html>
输出:
The Car object contains the name.