静态
Reflect.construct()
method acts like the
new
operator, but as a function. It is equivalent to calling
new target(...args)
. It gives also the added option to specify a different prototype.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Reflect.construct(target, argumentsList[, newTarget])
target
The target function to call.
argumentsList
target
should be called.
newTarget
可选
new.target
operator. If
newTarget
is not present, its value defaults to
target
.
A new instance of
target
(或
newTarget
, if present), initialized by
target
as a constructor with the given
argumentsList
.
A
TypeError
, if
target
or
newTarget
are not constructors.
Reflect.construct()
allows you to invoke a constructor with a variable number of arguments. (This would also be possible by using the
spread syntax
combined with the
new
operator
.)
let obj = new Foo(...args) let obj = Reflect.construct(Foo, args)
Reflect.construct()
vs
Object.create()
Prior to the introduction of
Reflect
, objects could be constructed using an arbitrary combination of constructor and prototype by using
Object.create()
.
function OneClass() {
this.name = 'one'
}
function OtherClass() {
this.name = 'other'
}
// Calling this:
let obj1 = Reflect.construct(OneClass, args, OtherClass)
// ...has the same result as this:
let obj2 = Object.create(OtherClass.prototype)
OneClass.apply(obj2, args)
console.log(obj1.name) // 'one'
console.log(obj2.name) // 'one'
console.log(obj1 instanceof OneClass) // false
console.log(obj2 instanceof OneClass) // false
console.log(obj1 instanceof OtherClass) // true
console.log(obj2 instanceof OtherClass) // true
//Another example to demonstrate below:
function func1(a, b, c, d) {
console.log(arguments[3]);
}
function func2(d, e, f, g) {
consol.log(arguments[3]);
}
let obj1 = Reflect.construct(func1, ['I', 'Love', 'my', 'India'])
obj1
However, while the end result is the same, there is one important difference in the process. When using
Object.create()
and
Function.prototype.apply()
,
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.
When invoking
Reflect.construct()
, on the other hand, the
new.target
operator will point to the
newTarget
parameter if supplied, or
target
if not.
function OneClass() {
console.log('OneClass')
console.log(new.target)
}
function OtherClass() {
console.log('OtherClass')
console.log(new.target)
}
let obj1 = Reflect.construct(OneClass, args)
// Output:
// OneClass
// function OneClass { ... }
let obj2 = Reflect.construct(OneClass, args, OtherClass)
// Output:
// OneClass
// function OtherClass { ... }
let obj3 = Object.create(OtherClass.prototype);
OneClass.apply(obj3, args)
// Output:
// OneClass
// undefined
Reflect.construct()
let d = Reflect.construct(Date, [1776, 6, 4]) d instanceof Date // true d.getFullYear() // 1776
| 规范 |
|---|
|
ECMAScript (ECMA-262)
The definition of 'Reflect.construct' in that specification. |
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
construct
|
Chrome 49 | Edge 12 | Firefox 42 | IE No | Opera 36 | Safari 10 | WebView Android 49 | Chrome Android 49 | Firefox Android 42 | Opera Android 36 | Safari iOS 10 | Samsung Internet Android 5.0 | nodejs 6.0.0 |
完整支持
不支持
Reflect
Object
Object.prototype.__defineGetter__()
Object.prototype.__defineSetter__()
Object.prototype.__lookupGetter__()
Object.prototype.__lookupSetter__()
Object.prototype.hasOwnProperty()
Object.prototype.isPrototypeOf()
Object.prototype.propertyIsEnumerable()
Object.prototype.toLocaleString()
Object.prototype.toSource()
Object.prototype.toString()
Object.prototype.valueOf()
Object.setPrototypeOf()