<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
// Reflect 对象与 Proxy 对象一样,es6 新api.
/* 一、概述:
设计目的:
1. 将 Object 对象的一些明显属于语言内部的方法(如:Object.defineProperty) ,
放到 Reflect 对象上。
2. 修改某些 Object 方法的放回结果,让其变得更合理。
Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,
而Reflect.defineProperty(obj, name, desc)则会返回false。
3. 让 Object 操作都变成函数行为。某些 Object 操作是命令式,让他们变成函数行为。
4. Reflect 对象的方法与 Proxy 对象的方法一一对应,只要是 Proxy 对象的方法,
就能在 Reflect 对象上找到对应的方法。可以让 Proxy 方便的调用对应的 Relect 方法,
完成默认行为,作为修改行为的基础。也就是说,不管 Proxy 怎么修改默认行为,
你总可以在 Reflect 上获取默认行为。
二、静态方法:
Reflect 对象一共有 13 个静态方法。
三、使用 Proxy 实现观察者模式:
观察者模式 (Observe mode)指的是函数自动观察数据对象,一旦对象有变化,函数就会自动执行。
*/
// 老写法:
try {
Object.defineProperty(target, property, attributes);
// success
} catch (e) {
// failure
}
// 新写法:
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}
// 命令式:
'assign' in Object //true
// 函数行为:
Reflect.has(Object, 'assign') //true
function Greeting(name) {
this.name = name;
}
// new 的写法
const instance = new Greeting('张三');
console.log(instance) //Greeting {name: "张三"}
// Reflect.construct 的写法
const instance1 = Reflect.construct(Greeting, ['张三']);
console.log(instance1) //Greeting {name: "张三"}
</script>
</body>
</html>
12_Reflect
最新推荐文章于 2022-05-06 15:59:19 发布