ECMAScript 2017 中的 Reflect.construct 方法详解

阅读时长 5 分钟读完

在 ECMAScript 2017 中,加入了一个非常有用的方法——Reflect.construct。Reflect.construct 方法可以在不使用 new 关键字的情况下,使用构造函数创建一个新的对象实例,是构造函数的一种补充方式,同时也可以对构造函数进行扩展和增强。

Reflect.construct 方法的语法

Reflect.construct 方法的语法如下:

参数

  • target:要使用构造函数的目标对象
  • args:构造函数参数组成的数组
  • constructor:作用于目标对象的构造函数

返回值

Reflect.construct 返回一个新的对象实例。

Reflect.construct 方法的作用

Reflect.construct 对比使用 new 关键字创建对象的方式,最重要的作用是可以动态地创建对象,可以传递一个构造函数及其参数,这使得我们可以在运行时进行判断,动态地创建不同的类实例。

同时,使用 Reflect.construct 方法创建新对象不会被 constructor.prototype 上的方法所污染。

Reflect.construct 方法的应用

动态判断需要调用哪个构造函数

在某些场景下,我们不知道要调用哪个构造函数,例如下面的代码:

使用 Reflect.construct 方法可以让这个过程更灵活:

创建具有不同原型的对象

当我们想要创建一个具有不同原型的对象时,我们可以使用 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

纠错
反馈