在 ES6 中,引入了类(class)这一新的语法特性,使得 JavaScript 可以更加方便地实现面向对象编程。而在 ES2019 中,又增加了一个新特性:new.target。这个特性在类构造函数内部使用时,可以获得类的名称,从而在某些场景下带来便利。
new.target 是什么
new.target 是一个新的元属性,可以仅在构造函数内部使用,指向直接被 new 调用的构造函数。如果构造函数是通过 super 调用的,new.target 则指向正在调用的子类构造函数。
我们可以用这个特性在构造函数内部判断是否是被 new 调用的:
class MyClass { constructor() { console.log(new.target === MyClass); } } const instance = new MyClass(); // true const notInstance = MyClass(); // false
因为 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