handler.construct()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
handler.construct()
方法用于拦截 new
操作符。为了使 new 操作符在生成的 Proxy 对象上生效,用于初始化代理的目标对象自身必须具有 [[Construct]] 内部方法(即 new target
必须是有效的)。
尝试一下
语法
js
var p = new Proxy(target, {
construct: function (target, argumentsList, newTarget) {},
});
参数
下面的参数将会传递给 construct
方法,this
绑定在 handler 上。
target
-
目标对象。
argumentsList
-
constructor 的参数列表。
newTarget
-
最初被调用的构造函数,就上面的例子而言是 p。
返回值
construct
方法必须返回一个对象。
描述
handler.construct()
方法用于拦截 new
操作符。
拦截
该拦截器可以拦截以下操作:
new proxy(...args)
Reflect.construct()
约束
如果违反以下约定,代理将会抛出错误 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
规范
Specification |
---|
ECMAScript Language Specification # sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget |
浏览器兼容性
BCD tables only load in the browser
相关主题
Proxy
handler
new
operator.Reflect.construct()