Proxy.handler.getPrototypeOf

Proxy.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

规范

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

浏览器兼容性

FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Basic supportNo support49 (49)No supportNo supportNo support

FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic supportNo supportNo support49.0 (49)No supportNo supportNo support