ECMAScript 2021 中的 new.target 使用详解

阅读时长 5 分钟读完

在 ECMAScript 2021 中,我们可以使用 new.target 来获取当前构造函数在运行时被直接写入的实例。这个特性可以帮助我们更好地进行继承和类的构造。

new.target 是什么?

在 ECMAScript 2015(ES6)之前,我们经常使用 instanceof 来判断当前执行上下文是否为构造函数。例如:

通过这种方式,我们可以保证在不使用 new 关键字调用构造函数时,代码能够正确运行。但是,instanceof 还存在一些问题。比如,当我们使用 Object.create 来创建对象时,instanceof 会失效,因为它是基于原型链的判断方式。

而使用 new.target,我们可以更加直观地判断当前上下文是不是构造函数的实例。例如:

-- -------------------- ---- -------
----- ------- -
  ------------- -
    -- ----------- --- -------- -
      ----- --- ----------------- ---- - ----- -- - -----------
    -

    -- ----------- ----
  -
-

----- -------- - --- ----------
----- --------- - ----------

在上面的例子中,我们定义了一个 myClass 类,并在构造函数中使用了 new.target。当我们使用 new 关键字来调用构造函数时,new.target 会获取到 myClass 构造函数。如果不使用 new 关键字来调用构造函数,new.target 会获取到 undefined。这样,我们就可以完美地防止了不恰当的构建行为。

new.target 的应用场景

当然,new.target 的应用不仅限于上面的这个例子。我们可以将它与我们的面向对象编程的概念相结合,来为我们的代码增加更灵活的能力。

例如,我们可以使用 new.target 来帮助我们创建可定义的子类,而不必担心修改父类的代码。

-- -------------------- ---- -------
----- ------ -
  ------------- -
    ------------------- ------------ ---------------------
  -
-

----- --- ------- ------ -
  ------------- -
    --------
    ------------------ ------------ ---------------------
  -
-

--- ---------
--- ------

在上面的例子中,我们定义了一个 Animal 类和一个 Cat 类。我们使用 new.target.name 来输出当前构造函数的名称。在使用 new 关键字创建 Animal 实例和 Cat 实例时,分别会输出 AnimalCat。这个特性可以帮助我们更加方便地进行类的继承。

new.target 的注意事项

使用 new.target 时,有以下需要注意的地方:

  • new.target 只能在构造函数内部使用。
  • new.target 只能在类的方法(包括构造函数)中使用。
  • 在没有使用 new 关键字的外部函数中无法访问 new.target

总结

在 ECMAScript 2021 中,new.target 成为了一个新的特性,可以帮助我们更加方便地构建类和继承。使用 new.target,我们可以很容易地判断当前执行上下文是否为构造函数的实例,同时还可以避免一些潜在错误。

值得注意的是,虽然 new.target 看起来很像一个普通的变量,但它只能在类的执行上下文中被支持和使用。需要结合其他的面向对象编程概念一起使用,才能发挥出更好的作用。

示例代码

下面是一些具体的示例代码:

-- -------------------- ---- -------
-- ----------
----- ---- -
  ------------- -
    -- ----------- --- ----- -
      ----- --- ----------------- --- ---- -- - -----------
    -

    ------------------------ -------
  -
-

-------
--- -------

-- -----
----- ------ -
  ------------- -
    ------------------- ------------ ---------------------
  -
-

----- ----- ------- ------ -
  ------------- -
    --------

    ------------------ ------------ ---------------------
  -
-

--- ---------
--- --------

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64749dec968c7c53b01f1bf5

纠错
反馈