Get to know MDN better
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
The Reflect.construct() static method is like the new operator, but as a function. It is equivalent to calling new target(...args). It additionally allows to specify a different new.target value.
The target function to call.
argumentsListAn array-like object specifying the arguments with which target should be called.
newTarget OptionalThe value of the new.target expression inside target. Defaults to target. Generally (see example), target specifies the logic to initialize the object, while newTarget.prototype specifies the prototype of the constructed object.
A new instance of target (or newTarget, if present), initialized by target as a constructor with the given argumentsList.
Thrown if target or newTarget is not a constructor, or if argumentsList is not an object.
Reflect.construct() provides the reflective semantic of a constructor call. That is, Reflect.construct(target, argumentsList, newTarget) is semantically equivalent to:
Note that when using the new operator, target and newTarget are always the same constructor — but Reflect.construct() allows you to pass a different new.target value. Conceptually, newTarget is the function on which new was called, and newTarget.prototype will become the constructed object's prototype, while target is the constructor that is actually executed to initialize the object. For example, new.target may also be different from the currently executed constructor in class inheritance.
Reflect.construct() allows you to invoke a constructor with a variable number of arguments. (This is also possible with the spread syntax in a normal constructor call.)
Reflect.construct() invokes the [[Construct]] object internal method of target.
If newTarget is passed, it changes the value of new.target inside the constructor. The constructed object will be an instance of newTarget, not target.
Of course, there's no strong guarantee about the prototype chain of the constructed object, as it depends on the constructor's implementation. For example, if the target constructor returns an object, then that object will be the constructed object, regardless of the newTarget value. If target is a proxy with a construct trap, then the trap fully controls the construction process.
A valid new.target should be a constructor function with a prototype property, but the latter is not enforced. If the prototype property's value is not an object, the initialized object will inherit from Object.prototype.
Prior to the introduction of Reflect, objects could be constructed using an arbitrary combination of constructors and prototypes using Object.create().
However, while the end result is the same, there is one important difference in the process. When using Object.create() and Function.prototype.apply(), the new.target operator will point to undefined within the function used as the constructor, since the new keyword is not being used to create the object. (In fact, it uses the apply semantic, not construct, although normal functions happen to operate nearly the same.)
When invoking Reflect.construct(), on the other hand, the new.target operator will point to the newTarget parameter if supplied, or target if not.
| ECMAScript® 2027 Language Specification # sec-reflect.construct |
Enable JavaScript to view this browser compatibility table.
This page was last modified on Jul 10, 2025 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.