This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
The handler.construct() method is a trap for the [[Construct]] object internal method, which is used by operations such as the new operator. In order for the new operation to be valid on the resulting Proxy object, the target used to initialize the proxy must itself be a valid constructor.
function Monster(disposition) {
this.disposition = disposition;
}
const handler = {
construct(target, args) {
console.log(`Creating a ${target.name}`);
// Expected output: "Creating a monster"
return new target(...args);
},
};
const ProxiedMonster = new Proxy(Monster, handler);
console.log(new ProxiedMonster("fierce").disposition);
// Expected output: "fierce"
new Proxy(target, {
construct(target, argumentsList, newTarget) {
}
})
The following parameters are passed to the construct() method. this is bound to the handler.
targetThe target constructor object.
argumentsListAn Array containing the arguments passed to the constructor.
newTargetThe constructor that was originally called.
The construct() method must return an object, representing the newly created object.
This trap can intercept these operations:
new operator: new myFunction(...args)
Reflect.construct()Or any other operation that invokes the [[Construct]] internal method.
The proxy's [[Construct]] internal method throws a TypeError if the handler definition violates one of the following invariants:
target must be a constructor itself.Object.The following code traps the new operator.
const p = new Proxy(function () {}, {
construct(target, argumentsList, newTarget) {
console.log(`called: ${argumentsList}`);
return { value: argumentsList[0] * 10 };
},
});
console.log(new p(1).value); // "called: 1"
// 10
The following code violates the invariant.
const p = new Proxy(function () {}, {
construct(target, argumentsList, newTarget) {
return 1;
},
});
new p(); // TypeError is thrown
The following code improperly initializes the proxy. The target in Proxy initialization must itself be a valid constructor for the new operator.
const p = new Proxy(
{},
{
construct(target, argumentsList, newTarget) {
return {};
},
},
);
new p(); // TypeError is thrown, "p" is not a constructor
| Desktop | Mobile | Server | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on IOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
construct |
49 | 12 | 18 | 36 | 10 | 49 | 18 | 36 | 10 | 5.0 | 49 | 10 | 1.0.0 | 1.0 | 6.0.0 |
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/construct