术语“new.target”在 ECMAScript 2015 规范(14.2.3 和 14.2.16)中很少出现,对其目的提出疑问。有趣的是,它的全名是 NewTarget,可在第 12.3.8 节中找到。
NewTarget 是一个元属性,用于检索当前范围内 [[NewTarget]] 的当前值非箭头函数环境。调用函数时,会分配一个 [[NewTarget]] 值,类似于 this 绑定。
以前,无法检测函数是否作为构造函数调用明确支持。然而,NewTarget 通过揭示 [[Construct]] 内部方法是否创建了环境记录来解决这个问题。根据§8.1.1.3,如果环境记录是由 [[Construct]] 创建的,则 [[NewTarget]] 保存 [[Construct]] newTarget 参数的值。否则,它仍然是未定义的。
虽然语法糖,ES6 类提供了真正的继承。这就是NewTarget发挥关键作用的地方。当使用 new X 调用类构造函数时, this 值最初是未设置的。构造函数中的 super() 调用创建对象,但继承自最初调用的构造函数的 .prototype。
NewTarget 捕获接收新调用的最外层构造函数。它不是当前正在执行的构造函数。该值是传递到 OrdinaryCreateFromConstructor 过程的值,确保实例正确继承所需的原型。
为了说明这一点,请考虑以下类:
<code class="javascript">class Parent { constructor() { // implicit (from the `super` call) // new.target = Child; // implicit (because `Parent` doesn't extend anything): // this = Object.create(new.target.prototype); console.log(new.target) // Child! } } class Child extends Parent { constructor() { // `this` is uninitialised (and would throw if accessed) // implicit (from the `new` call): // new.target = Child super(); // this = Reflect.construct(Parent, [], new.target); console.log(this); } } new Child;</code>
在这个例子中,NewTarget 允许 Parent 类认识到它是通过 Child 类作为构造函数调用的。然后,Child 类在其 super() 调用期间利用此信息来正确建立继承。
以上是new.target 如何帮助我们理解 ES6 类中的继承?的详细内容。更多信息请关注PHP中文网其他相关文章!