此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in English Always switch to English

handler.construct()

基线 广泛可用

自 2016年9月 起,此特性已在主流浏览器中得到支持,可在大多数设备和浏览器版本中正常使用。

handler.construct() 方法用于拦截 new 操作符。为了使 new 操作符在生成的 Proxy 对象上生效,用于初始化代理的目标对象自身必须具有 [[Construct]] 内部方法(即 new target 必须是有效的)。

尝试一下

function monster1(disposition) {
  this.disposition = disposition;
}

const handler1 = {
  construct(target, args) {
    console.log(`Creating a ${target.name}`);
    // Expected output: "Creating a monster1"

    return new target(...args);
  },
};

const proxy1 = new Proxy(monster1, handler1);

console.log(new proxy1("fierce").disposition);
// Expected output: "fierce"

语法

js
var p = new Proxy(target, {
  construct: function (target, argumentsList, newTarget) {},
});

参数

下面的参数将会传递给 construct 方法,this 绑定在 handler 上。

target

目标对象。

argumentsList

constructor 的参数列表。

newTarget

最初被调用的构造函数,就上面的例子而言是 p。

返回值

construct 方法必须返回一个对象。

描述

handler.construct() 方法用于拦截 new操作符。

拦截

该拦截器可以拦截以下操作:

约束

如果违反以下约定,代理将会抛出错误 TypeError:

  • 必须返回一个对象。

示例

下面代码演示如何拦截 new 操作。

js
var p = new Proxy(function () {}, {
  construct: function (target, argumentsList, newTarget) {
    console.log("called: " + argumentsList.join(", "));
    return { value: argumentsList[0] * 10 };
  },
});

console.log(new p(1).value); // "called: 1"; outputs 10

下面的代码违反了约定。

js
var p = new Proxy(function () {}, {
  construct: function (target, argumentsList, newTarget) {
    return 1;
  },
});

new p(); // TypeError is thrown

下面的代码未能正确的初始化 Proxy。Proxy 初始化时,传给它的 target 必须具有一个有效的 constructor 供 new 操作符调用。

js
var p = new Proxy(
  {},
  {
    construct: function (target, argumentsList, newTarget) {
      return {};
    },
  },
);

new p(); // TypeError is thrown, "p" is not a constructor

规范

规范
ECMAScript® 2027 Language Specification
# sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget

浏览器兼容性

相关主题