在 ECMAScript 2019 中,它增加了一个新的特性: new.target,它可以帮助我们更方便地识别构造函数是否被调用。
而在 ES6 中,构造函数中引入了 constructor 关键字,用于指示一个类的构造函数。
本文将探讨新特性 new.target 和 constructor,并提供深度及实用的学习和指导意义。
new.target
new.target 是指构造函数内部使用的一个元属性,它返回 new 操作符的目标构造函数。如果函数不是通过 new 操作符调用的,则 new.target 的值为 undefined。
以下是一个简单的例子:
class Foo { constructor() { console.log(new.target === Foo); } } new Foo(); //输出 true Foo(); //输出 false
在这个例子中,我们在 Foo 构造函数中使用了 new.target,然后我们创建了一个名为 Foo 的类的新实例。
当我们通过 new 操作符调用时,new.target 等于该类本身,而当我们直接调用 Foo 函数时,new.target 等于 undefined。
new.target 可以用来检测子类是否通过 new 关键字继承,例如:
class Parent { constructor() { console.log(new.target) } } class Child extends Parent{} new Parent(); // 输出 [Function: Parent] new Child(); // 输出 [Function: Child]
在这个例子中,我们创建了一个 Parent 类和 Child 类,Child 继承了 Parent。
当我们用 new 调用 Parent 类时,new.target 等于 Parent 类本身。
当我们用 new 调用 Child 类时,new.target 等于 Child 类本身,这是 new.target 的一个强大功能,它可以让我们检测子类是否通过 new 继承。
constructor
constructor 是 ES6 中的一个关键字,用于声明一个类的构造函数。它可以让我们更清晰地定义一个类的实例属性。
下面是一个示例:
class Person { constructor(name) { this.name = name; } } let p1 = new Person('Tom'); // 实例化一个 Person 对象并赋值给 p1 console.log(p1.name); // 输出 'Tom'
在这个例子中,我们定义了一个名为 Person 的类和它的构造函数。构造函数中我们通过 this 关键字为每个实例添加了一个名为 name 的属性。
使用 constructor 可以使 Person 类更加清晰,也可以在实例化时轻松地初始化属性。
constructor 还可以被用来控制类的继承,下面是一个继承示例:
class Animal { constructor(name) { this.name = name; } speak() { console.log(this.name + ' makes a noise.'); } } class Dog extends Animal { constructor(name) { super(name); // 呼叫母类构造函数 } speak() { console.log(this.name + ' barks.'); } } let d = new Dog('Mitzie'); d.speak(); // 输出 'Mitzie barks.'
在这个例子中,我们定义了一个 Animal 类和它的构造函数和一个方法 speak。然后我们定义了一个名为 Dog 的类并扩展了 Animal。
在 Dog 类的构造函数里,我们通过 super(name) 调用了 Animal 类的构造函数。这样所有的 Dog 实例都会继承 Animal 实例的 name 属性。
最后我们重新定义了 Dog 的 speak 方法,这样 Dog 实例调用 speak 方法就会输出 'Mitzie barks.'。
在这个例子中,constructor 让我们轻松地扩展了 Animal 类并控制了 Dog 的初始化。
总结
new.target 和 constructor 是 ES6 和 ECMAScript 2019 中的两个重要特性,在类和构造函数中都扮演着重要的角色。
new.target 可以让我们更好地识别构造函数是否被调用,并且还可以帮助我们检测子类是否通过 new 继承。
而 constructor 可以让我们清晰地定义类的构造函数,控制类的继承和实例化时的属性初始化。
了解和使用这两个特性,将使我们编写的代码更加简洁和可读,并提高代码的可维护性和可扩展性。
参考
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a7608badd4f0e0ff0693b0