首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Proxy.handler.getPrototypeOf

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

语法

代码语言:javascript
复制
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() 方法返回的原型不是目标对象本身的原型。

示例

例子:基本用法

代码语言:javascript
复制
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 代理方法的方式

代码语言:javascript
复制
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
);

例子:两种情况下的异常

代码语言:javascript
复制
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

规范

Specification

Status

Comment

ECMAScript 2015 (6th Edition, ECMA-262)The definition of '[GetPrototypeOf]' in that specification.

Standard

Initial definition.

ECMAScript 2017 Draft (ECMA-262)The definition of '[GetPrototypeOf]' in that specification.

Draft

?

浏览器兼容性

Feature

Chrome

Firefox (Gecko)

Internet Explorer

Opera

Safari

Basic support

No support

49 (49)

No support

No support

No support

Feature

Android

Chrome for Android

Firefox Mobile (Gecko)

IE Mobile

Opera Mobile

Safari Mobile

Basic support

No support

No support

49.0 (49)

No support

No support

No support

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com