• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • handler.getPrototypeOf()

    handler.getPrototypeOf()是一个代理方法,当读取代理对象的原型时,该方法就会被调用。

    语法

    var p = new Proxy(obj, {
      getPrototypeOf(target) {
      ...
      }
    });
    

    参数

    getPrototypeOf方法被调用时,this指向的是它所属的处理器对象。

    target
    被代理的目标对象。

    返回值

    getPrototypeOf方法的返回值必须是一个对象或者null

    描述

    在 JavaScript 中,有下面这五种操作(方法/属性/运算符)可以触发 JS 引擎读取一个对象的原型,也就是可以触发getPrototypeOf()代理方法的运行:

    • Object.getPrototypeOf()
    • Reflect.getPrototypeOf()
    • __proto__
    • Object.prototype.isPrototypeOf()
    • instanceof

    如果遇到了下面两种情况,JS 引擎会抛出TypeError异常:

    • getPrototypeOf()方法返回的不是对象也不是null。
    • 目标对象是不可扩展的,且getPrototypeOf()方法返回的原型不是目标对象本身的原型。

    示例

    例子:基本用法

    var obj = {};
    var proto = {};
    var handler = {
        getPrototypeOf(target) {
            console.log(target === obj);   // true
            console.log(this === handler); // true
            return proto;
        }
    };
    
    var p = new Proxy(obj, handler);
    console.log(Object.getPrototypeOf(p) === proto);    // true
    

    例子:5 种触发 getPrototypeOf 代理方法的方式

    var obj = {};
    var p = new Proxy(obj, {
        getPrototypeOf(target) {
            return Array.prototype;
        }
    });
    console.log(
        Object.getPrototypeOf(p) === Array.prototype,  // true
        Reflect.getPrototypeOf(p) === Array.prototype, // true
        p.__proto__ === Array.prototype,               // true
        Array.prototype.isPrototypeOf(p),              // true
        p instanceof Array                             // true
    );
    

    例子:两种情况下的异常

    var obj = {};
    var p = new Proxy(obj, {
        getPrototypeOf(target) {
            return "foo";
        }
    });
    Object.getPrototypeOf(p); // TypeError: "foo" is not an object or null
    
    var obj = Object.preventExtensions({});
    var p = new Proxy(obj, {
        getPrototypeOf(target) {
            return {};
        }
    });
    Object.getPrototypeOf(p); // TypeError: expected same prototype value