• Proxy:拦截某些操作并实现自定义行为。
      1. let handler = {
      2. get: function(target, name){
      3. return name in target ? target[name] : 42;
      4. }};
      5. let p = new Proxy({}, handler);
      6. p.a = 1;
      7. 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。

      1. var revocable = Proxy.revocable({}, {
      2. get: function(target, name) {
      3. return "[[" + name + "]]";
      4. }
      5. });
      6. var proxy = revocable.proxy;
      7. console.log(proxy.foo); // "[[foo]]"
      8. revocable.revoke();
      9. console.log(proxy.foo); // TypeError is thrown
      10. proxy.foo = 1 // TypeError again
      11. delete proxy.foo; // still TypeError
      12. typeof proxy // "object", typeof doesn't trigger any trap
    • 反射:Reflect().可拦截JS操作的方法。有助于将默认操作从初始程序转发给目标。

      1. Reflect.has(Object, "assign"); // true
    • 更好的 Array函数

    使用 Function.Prototype.Appay()方法调用一个具有给定 This值和 Arguments数组(或类数组对象) 的函数。

    1. Function.prototype.apply.call(Math.floor, undefined, [1.75]);

    使用 Reflect.Array,这变得不那么冗长和容易理解:

    1. Reflect.apply(Math.floor, undefined, [1.75]);
    2. // 1;
    3. Reflect.apply(String.fromCharCode, undefined, [104, 101, 108, 108, 111]);
    4. // "hello"
    5. Reflect.apply(RegExp.prototype.exec, /ab/, ['confabulation']).index;
    6. // 4
    7. Reflect.apply(''.charAt, 'ponies', [3]);
    8. // "i"
    • 检验代码是否正确。使用 Object.DefineProperty,如果成功返回一个对象,否则抛出一个 TypeError,你将使用 Try-Catch块来捕获定义属性时发生的任何错误。因 Reflect.defineProperty为返回一个布尔值表示的成功状态,你可以在这里使用 If-else 块