Reflect.construct() - JavaScript Reflect 对象
Reflect.construct()
Reflect
.construct()
方法的行为有点像new
操作符构造函数,相当于运行new target(...args)
.
语法
Reflect.construct(target, argumentsList[, newTarget])
参数
target
被运行的目标构造函数argumentsList
类数组,目标构造函数调用时的参数。newTarget
可选新创建对象的原型对象,参考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
值会自动指定到targe
(或者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
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)