ECMAScript 2019:使用 new.target 在 ES6 构造函数中获得类的名称

阅读时长 4 分钟读完

在 ES6 中,引入了类(class)这一新的语法特性,使得 JavaScript 可以更加方便地实现面向对象编程。而在 ES2019 中,又增加了一个新特性:new.target。这个特性在类构造函数内部使用时,可以获得类的名称,从而在某些场景下带来便利。

new.target 是什么

new.target 是一个新的元属性,可以仅在构造函数内部使用,指向直接被 new 调用的构造函数。如果构造函数是通过 super 调用的,new.target 则指向正在调用的子类构造函数。

我们可以用这个特性在构造函数内部判断是否是被 new 调用的:

因为 MyClass 的构造函数中使用了 new.target,所以在 MyClass 实例化时,new.target 指向 MyClass,输出 true;而在不使用 new 实例化 MyClass 时,构造函数中没有使用 new.target,输出 undefined(在严格模式下会报错)。

在构造函数中获取类的名称

在很多场景下,获取类的名称是有用的。例如,我们希望在类的一些方法中调用其他的同名方法,但是担心某一天我们会重命名类,导致调用的方法失效。这种情况下,我们可以使用 new.target 获取类名,从而避免类名变更带来的问题。

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

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

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

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

在 MyClass 的构造函数中,我们可以判断 new.target 是否为 MyClass,从而确保 MyClass 只能通过 new 被实例化。而在 ChildClass 的构造函数中,不需要额外处理 new.target,因为它已经继承了 MyClass 的构造函数。

总结

new.target 是 ES2019 中新增的一个语法特性,仅在类构造函数内部使用,可以用来判断是否是通过 new 被实例化的。而在一些特殊场景下,我们还可以通过 new.target 获取类的名称,从而避免类名变更带来的问题。

在实际开发中,我们可以结合 new.target 和其他语法特性,更好地实现面向对象编程。同时,需要注意的是,new.target 只能在类构造函数内部使用,不能在其他函数或一般代码块中使用。

参考代码

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

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

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

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

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

纠错
反馈