handler.setPrototypeOf()

handler.setPrototypeOf() 方法主要用来拦截 Object.setPrototypeOf().

语法

var p = new Proxy(target, {
  setPrototypeOf: function(target, prototype) {
  }
});

参数

以下参数传递给 setPrototypeOf 方法. 

target
被拦截目标对象.
prototype
对象新原型或为 null.

返回值

如果成功修改了[[Prototype]]setPrototypeOf 方法返回 true,否则返回 false.

描述

这个 handler.setPrototypeOf 方法用于拦截 Object.setPrototypeOf().

拦截

这个方法可以拦截以下操作:

Invariants

如果违反了下列规则,则proxy将抛出一个TypeError:

  • 如果 target 不可扩展, 原型参数必须与Object.getPrototypeOf(target) 的值相同.

示例

如果你不想为你的对象设置一个新的原型,你的handler's的setPrototypeOf方法可以返回false,也可以抛出异常。

The former approach means that any operation that performs such mutation, that throws an exception on failure to mutate, will have to create the exception itself.  For example, Reflect.setPrototypeOf(), no exception will be thrown.

var handlerReturnsFalse = {
    setPrototypeOf(target, newProto) {
        return false;
    }
};

var newProto = {}, target = {};

var p1 = new Proxy(target, handlerReturnsFalse);
Object.setPrototypeOf(p1, newProto); // throws a TypeError
Reflect.setPrototypeOf(p1, newProto); // returns false

The latter approach will cause any operation that attempts to mutate, to throw.  This approach is required if you want even non-throwing operations to throw on failure, or you want to throw a custom exception value.

var handlerThrows = {
    setPrototypeOf(target, newProto) {
        throw new Error('custom error');
    }
}; 

var newProto = {}, target = {};

var p2 = new Proxy(target, handlerThrows);
Object.setPrototypeOf(p2, newProto); // throws new Error("custom error")
Reflect.setPrototypeOf(p2, newProto); // throws new Error("custom error")

Specifications

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
[[SetPrototypeOf]]
Standard Initial definition.
ECMAScript Latest Draft (ECMA-262)
[[SetPrototypeOf]]
Draft  

Browser compatibility

Update compatibility data on GitHub
Desktop Mobile Server
Chrome Edge Firefox Internet Explorer Opera Safari Android webview Chrome for Android Firefox for Android Opera for Android Safari on iOS Samsung Internet Node.js
setPrototypeOf Chrome Full support 49 Edge Full support 12 Firefox Full support 49 IE No support No Opera Full support 36 Safari ? WebView Android Full support 49 Chrome Android Full support 49 Firefox Android Full support 49 Opera Android Full support 36 Safari iOS ? Samsung Internet Android Full support 5.0 nodejs Full support 6.0.0

Legend

Full support  
Full support
No support  
No support
Compatibility unknown  
Compatibility unknown

See also