- Proxy:拦截某些操作并实现自定义行为。
let handler = {get: function(target, name){return name in target ? target[name] : 42;}};let p = new Proxy({}, handler);p.a = 1;console.log(p.a, p.b); // 1, 42
Proxy对象定义了一个目标(这里是一个空对象)和一个实现了get陷阱的 handle 对象。这里,代理的对象在获取未定义的属性时不会返回 Undefined,而是返回 42。
在这里拦截的就是返回 Undefined的操作。
- 术语。
Handler包含陷阱的占位符对象。
traps提供属性访问的方法。这类似于操作系统中陷阱的概念。
target代理虚拟化的对象。它通常用作代理的存储后端。根据目标验证关于对象不可扩展性或不可配置属性的不变量(保持不变的语义)。
invariants实现自定义操作时保持不变的语义称为不变量。如果你违反处理程序的不变量,则会抛出一个 TypeError。
撤销 Proxy:Proxy.revocable()方法.这意味着代理可以通过 Revoke函数撤销 Proxy并关闭代理。此后,代理上的任何操作都会 TypeError。
var revocable = Proxy.revocable({}, {get: function(target, name) {return "[[" + name + "]]";}});var proxy = revocable.proxy;console.log(proxy.foo); // "[[foo]]"revocable.revoke();console.log(proxy.foo); // TypeError is thrownproxy.foo = 1 // TypeError againdelete proxy.foo; // still TypeErrortypeof proxy // "object", typeof doesn't trigger any trap
反射:Reflect().可拦截JS操作的方法。有助于将默认操作从初始程序转发给目标。
Reflect.has(Object, "assign"); // true
更好的 Array函数
使用 Function.Prototype.Appay()方法调用一个具有给定 This值和 Arguments数组(或类数组对象) 的函数。
Function.prototype.apply.call(Math.floor, undefined, [1.75]);
使用 Reflect.Array,这变得不那么冗长和容易理解:
Reflect.apply(Math.floor, undefined, [1.75]);// 1;Reflect.apply(String.fromCharCode, undefined, [104, 101, 108, 108, 111]);// "hello"Reflect.apply(RegExp.prototype.exec, /ab/, ['confabulation']).index;// 4Reflect.apply(''.charAt, 'ponies', [3]);// "i"
- 检验代码是否正确。使用 Object.DefineProperty,如果成功返回一个对象,否则抛出一个 TypeError,你将使用 Try-Catch块来捕获定义属性时发生的任何错误。因 Reflect.defineProperty为返回一个布尔值表示的成功状态,你可以在这里使用 If-else 块
