注意 ES6 的 new.target,ES11 中它有了新特性!

阅读时长 3 分钟读完

在 JavaScript 的面向对象编程中,我们经常使用构造函数来创建对象实例。ES6 提供了一个新特性 new.target,它用于判断是否是通过 new 关键字调用构造函数创建的实例。

new.target 基本用法

new.target 是一个元属性,它在构造函数内部使用,在构造函数中,它指向当前正在执行的构造函数。

Animal 的构造函数内部,我们使用 console.log 来输出 new.target,当我们通过 new 关键字创建实例时,输出的是构造函数本身;而当我们直接调用构造函数时,输出的是 undefined

这里需要注意的是,new.target 只有在构造函数内部才有定义,如果在构造函数的外部使用 new.target,会抛出 ReferenceError 异常。

new.target 的新特性

在 ES11 中,new.target 添加了新的功能,我们可以使用它来创建抽象类。

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

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

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

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

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

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

Shape 的构造函数中,我们使用 if (new.target === Shape) 来判断是否是通过 Shape 构造函数创建的实例,如果是,则抛出 TypeError 异常,因为抽象类不能直接实例化。

Rect 类中,我们继承了 Shape 类,然后实现了 draw 方法,可以直接创建 Rect 实例并调用 draw 方法。

总结

new.target 是一个非常实用的元属性,在构造函数中使用它可以判断是否是通过 new 关键字创建的实例,在 ES11 中,它还可以用来创建抽象类。

对于前端开发者来说,掌握 new.target 的使用方法可以提高开发效率,并且可以写出更加优美的代码。

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

纠错
反馈