Reflect.construct() - JavaScript 编辑
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
允许你使用可变的参数来调用构造函数 ,这和使用new操作符搭配对象展开符调用一样。
var obj = new Foo(...args);
var obj = Reflect.construct(Foo, args);
Reflect.construct() vs Object.create()
在新语法Reflect
出现之前,是通过明确指定构造函数和原型对象( 使用Object.create()
)来创建一个对象的。
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指定了)。
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()
var d = Reflect.construct(Date, [1776, 6, 4]);
d instanceof Date; // true
d.getFullYear(); // 1776
规范
Specification | Status | Comment |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) Reflect.construct | Standard | Initial definition. |
ECMAScript (ECMA-262) Reflect.construct | Living Standard |
浏览器兼容
We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 49 | 42 (42) | 未实现 | 未实现 | 未实现 |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | 未实现 | 未实现 | 42.0 (42) | 未实现 | 未实现 | 未实现 |
相关链接
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论