在 ECMAScript 2021 中,我们可以使用 new.target
来获取当前构造函数在运行时被直接写入的实例。这个特性可以帮助我们更好地进行继承和类的构造。
new.target 是什么?
在 ECMAScript 2015(ES6)之前,我们经常使用 instanceof
来判断当前执行上下文是否为构造函数。例如:
function myClass() { if (!(this instanceof myClass)) { throw new Error('Must be called with new keyword.'); } // Constructor body }
通过这种方式,我们可以保证在不使用 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
实例时,分别会输出 Animal
和 Cat
。这个特性可以帮助我们更加方便地进行类的继承。
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