在之前的 JavaScript 版本中,构造函数中使用的 this
始终指向当前方法的实例,而属性 prototype
是创建该实例的对象。但是在 ES11 中,新的 new.target
属性提供了一种方法来获取构造函数的引用,而不是实例本身的引用。本文将深入探讨 new.target
属性的详细内容,并提供使用它的示例代码。
new.target
属性
new.target
是一个元属性,表示当一个函数或构造函数使用 new
关键字进行实例化时,该函数或构造函数的引用。如果函数或构造函数不是使用 new
关键字进行实例化,则 new.target
为 undefined
。元属性是只读的,并且在函数内部始终可用。
// javascriptcn.com 代码示例 function Person1() { console.log(new.target); } function Person2() { console.log(new.target); } Person1(); // undefined new Person1(); // [Function: Person1] Person2.call({}); // undefined new Person2(); // [Function: Person2]
在上面的示例中,Person1
和 Person2
函数都使用 new.target
属性进行引用,但 Person2
函数使用了一个 call
方法,所以 new.target
为 undefined。
使用 new.target
创建继承的类
在 ES11 中,我们可以使用 new.target
属性来创建继承的类。在构造函数内使用 new.target
属性可以确保在继承时调用正确的构造函数。例如,我们有一个 Person
类和一个 Student
类,Student
类继承自 Person
类。我们可以在 Student
类的构造函数中使用 new.target
属性来确保在继承时调用正确的构造函数。
// javascriptcn.com 代码示例 class Person { constructor(name, age) { console.log(new.target.name); // Person this.name = name; this.age = age; } } class Student extends Person { constructor(name, age, grade) { super(name, age); console.log(new.target.name); // Student this.grade = grade; } } const student = new Student('John', 18, 'A'); console.log(student); // Student { name: 'John', age: 18, grade: 'A' }
在上面的示例中,Student
类继承了 Person
类,并在其构造函数中使用了 new.target
属性。当我们创建 Student
类的实例时,将首先调用 Person
的构造函数,然后调用 Student
的构造函数。
总结
new.target
属性是 ES11 中的新特性,它提供了一种获取构造函数的引用的方法,而不是实例本身的引用。在构造函数内使用 new.target
属性可以确保在继承时调用正确的构造函数。通过本文的学习,您可以更好地理解并应用 new.target
属性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653f4f2c7d4982a6eb8d9ce6