阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      JS Proxy getPrototypeOf()

      概述

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

      语法

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

      参数

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

      target

      被代理的目标对象。

      返回值

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

      描述

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

      如果遇到了下面两种情况,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
      
      

      规范

      规范名称规范状态备注
      ECMAScript 2015 (6th Edition, ECMA-262)[[GetPrototypeOf]]Standard 

      相关链接

      目录
      目录