在 ECMAScript 2017 中,加入了一个非常有用的方法——Reflect.construct。Reflect.construct 方法可以在不使用 new 关键字的情况下,使用构造函数创建一个新的对象实例,是构造函数的一种补充方式,同时也可以对构造函数进行扩展和增强。
Reflect.construct 方法的语法
Reflect.construct 方法的语法如下:
Reflect.construct(target, args[, constructor])
参数
target
:要使用构造函数的目标对象args
:构造函数参数组成的数组constructor
:作用于目标对象的构造函数
返回值
Reflect.construct 返回一个新的对象实例。
Reflect.construct 方法的作用
Reflect.construct 对比使用 new 关键字创建对象的方式,最重要的作用是可以动态地创建对象,可以传递一个构造函数及其参数,这使得我们可以在运行时进行判断,动态地创建不同的类实例。
同时,使用 Reflect.construct 方法创建新对象不会被 constructor.prototype 上的方法所污染。
Reflect.construct 方法的应用
动态判断需要调用哪个构造函数
在某些场景下,我们不知道要调用哪个构造函数,例如下面的代码:
class A {} class B {} let type = "A"; let obj = new A(); if (type === "B") { obj = new B(); }
使用 Reflect.construct 方法可以让这个过程更灵活:
let type = "A"; let obj = Reflect.construct(type === "B" ? B : A, []);
创建具有不同原型的对象
当我们想要创建一个具有不同原型的对象时,我们可以使用 Reflect.construct 方法,因为使用 Reflect.construct 方法创建新对象不会被 constructor.prototype 上的方法所污染。
-- -------------------- ---- ------- ----- ---- - ------------- - ---------- - -------- - - ----- ------- ------- ---- - ------------- - -------- ---------- - -------- - - --- ------- - ----------------------- ---- --- ---------- - -------------------------- ---- ------------------- ---------- ------ -- ---- ---------------------- ---------- --------- -- ---- ------------------- ---------- --------- -- ----- ---------------------- ---------- ------ -- ----- --------------------------- -- ------- --------------------------- -- --------- ------------------------------ -- ------- ------------------------------ -- -------
扩展现有类
可以使用 Reflect.construct 方法扩展现有类,这种方式有些类似于 C++ 和 Java 中的继承和重载。
在下面的示例中,使用 Reflect.construct 方法扩展 Array 类:
-- -------------------- ---- ------- ----- ------- ------- ----- - -------------------- - -------- ------------------------ ----- --------- - - --- ------- - --- -------------- ------- ------------------- ---------- ------- -- ---- ------------------- ---------- --------- -- ---- ---------------------------- -- - -------------------- ---------------------------- -- - ------------------------ -- ---
在这个示例中,MyArray 继承了 Array,通过调用 Reflect.construct,使用了 Array 的构造函数构造了一个基础的 Array 对象,最后再扩展 MyArray。
总结
Reflect.construct 方法是 ECMAScript 2017 中一个非常有用的方法,它可以在不使用 new 关键字的情况下,使用构造函数创建一个新的对象实例,这个方法可以动态地创建对象、创建具有不同原型的对象,也可以扩展现有类。但需要注意的是,如果传入的参数不是一个构造函数,将会抛出 TypeError,同时 Reflect.construct 返回的对象实例并没有使用 constructor 的 prototype。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6463281a968c7c53b042bd28