Reflect.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.
Reflect.construct()
方法的行为有点像 new
操作符 构造函数,相当于运行 new target(...args)
.
语法
Reflect.construct(target, argumentsList[, newTarget])
参数
target
-
被运行的目标构造函数
argumentsList
-
类数组,目标构造函数调用时的参数。
newTarget
可选-
作为新创建对象的原型对象的
constructor
属性,参考new.target
操作符,默认值为target
。
返回值
以target
(如果newTarget
存在,则为newTarget
)函数为构造函数,argumentList
为其初始化参数的对象实例。
异常
如果 target 或者 newTarget 不是构造函数,抛出TypeError
,异常。
描述
Reflect.construct()
vs Object.create()
在新语法 Reflect
出现之前,是通过明确指定构造函数和原型对象(使用Object.create()
)来创建一个对象的。
js
function OneClass() {
this.name = "one";
}
function OtherClass() {
this.name = "other";
}
// 创建一个对象:
var obj1 = Reflect.construct(OneClass, args, OtherClass);
// 与上述方法等效:
var 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
虽然两种方式结果相同,但在创建对象过程中仍一点不同。
当使用Object.create()
和Function.prototype.apply()
时,如果不使用new
操作符调用构造函数,构造函数内部的new.target
值会指向undefined
。
当调用Reflect.construct()
来创建对象,new.target
值会自动指定到target
(或者 newTarget,前提是 newTarget 指定了)。
js
function OneClass() {
console.log("OneClass");
console.log(new.target);
}
function OtherClass() {
console.log("OtherClass");
console.log(new.target);
}
var obj1 = Reflect.construct(OneClass, args);
// 输出:
// OneClass
// function OneClass { ... }
var obj2 = Reflect.construct(OneClass, args, OtherClass);
// 输出:
// OneClass
// function OtherClass { ... }
var obj3 = Object.create(OtherClass.prototype);
OneClass.apply(obj3, args);
// 输出:
// OneClass
// undefined
示例
使用 Reflect.construct()
js
var d = Reflect.construct(Date, [1776, 6, 4]);
d instanceof Date; // true
d.getFullYear(); // 1776
规范
Specification |
---|
ECMAScript Language Specification # sec-reflect.construct |
浏览器兼容性
BCD tables only load in the browser