在 JavaScript 的面向对象编程中,我们经常使用构造函数来创建对象实例。ES6 提供了一个新特性 new.target
,它用于判断是否是通过 new
关键字调用构造函数创建的实例。
new.target
基本用法
new.target
是一个元属性,它在构造函数内部使用,在构造函数中,它指向当前正在执行的构造函数。
class Animal { constructor() { console.log(new.target); } } const cat = new Animal(); // 输出:class Animal { ... } const dog = Animal(); // 输出:undefined
在 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