引言
在 ECMAScript 2017 中,引入了一个新的特性:new.target
。这个特性可以让我们更方便地在构造函数中获取当前实例化的构造函数对象,从而实现更加灵活和可维护的代码。本文将详细介绍 new.target
的使用方法,并提供示例代码帮助读者更好地理解。
new.target
的基本用法
new.target
是一个元属性(meta property),它可以在构造函数中使用,表示当前正在实例化的构造函数对象。例如:
// javascriptcn.com 代码示例 class Animal { constructor() { console.log(new.target); } } class Dog extends Animal {} new Animal(); // 输出 Animal new Dog(); // 输出 Dog
在上面的代码中,我们定义了一个基类 Animal
和一个继承自 Animal
的子类 Dog
。在 Animal
的构造函数中,我们打印了 new.target
的值,可以看到当我们实例化 Animal
和 Dog
时,分别输出了 Animal
和 Dog
。
从上面的示例中,我们可以看到 new.target
可以让我们在构造函数中获取当前实例化的构造函数对象,这对于实现一些基于继承的逻辑非常有用。
new.target
和工厂函数
除了在构造函数中使用,new.target
还可以在工厂函数中使用。工厂函数是一种创建对象的函数,它并不是构造函数,但是可以返回一个新的对象。
在工厂函数中,我们可以使用 new.target
来判断当前函数是否被通过 new
关键字调用。例如:
// javascriptcn.com 代码示例 function createAnimal() { if (new.target) { // 通过 new 关键字调用 return new Animal(); } else { // 直接调用 return { name: 'animal' }; } } class Animal { constructor() { this.name = 'animal'; } } const animal1 = createAnimal(); // { name: 'animal' } const animal2 = new createAnimal(); // Animal { name: 'animal' }
在上面的代码中,我们定义了一个工厂函数 createAnimal
,它可以通过 new
关键字调用返回一个新的 Animal
对象,也可以直接调用返回一个普通对象。在函数中,我们使用了 new.target
来判断当前函数是否被通过 new
关键字调用,从而决定返回的对象类型。
new.target
和继承
new.target
还可以用于继承中。在继承中,子类可以通过 super()
调用父类的构造函数,这时候 new.target
就非常有用了。
在子类的构造函数中,new.target
表示的是子类的构造函数对象,而不是父类的构造函数对象。例如:
// javascriptcn.com 代码示例 class Animal { constructor() { console.log(new.target); // 输出 Animal 或其子类的构造函数 } } class Dog extends Animal { constructor() { super(); } } new Animal(); // 输出 Animal new Dog(); // 输出 Dog
在上面的代码中,我们定义了一个基类 Animal
和一个继承自 Animal
的子类 Dog
。在 Animal
的构造函数中,我们打印了 new.target
的值,可以看到当我们实例化 Animal
和 Dog
时,分别输出了 Animal
和 Dog
。
总结
new.target
是 ECMAScript 2017 中的一个新特性,它可以让我们更方便地在构造函数中获取当前实例化的构造函数对象,从而实现更加灵活和可维护的代码。在本文中,我们介绍了 new.target
的基本用法、和工厂函数的结合、以及和继承的结合。通过这些示例代码,相信读者已经掌握了 new.target
的使用方法,可以在实际开发中应用它来提高代码质量和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6506c76795b1f8cacd274b52