ECMAScript 2015规范中提到关键字(或单词?) new.target 准确3次-14.2.3 1次:



两次在14.2.16中:



MDN提到了它,但是它非常模糊并且页面不完整。

Babel似乎不支持它。尝试在函数(箭头或其他函数)中使用new.target时遇到语法错误。

它是什么?应如何使​​用?

最佳答案

您没有在规范中找到它,因为在语法定义中,它用空格写成new . target。表达式的名称是NewTarget,并且您会发现它几次。

NewTarget是所谓的meta properties中的第一个,可以在第12.3.8节中找到。

其唯一目的是将当前(非箭头)函数环境的[[NewTarget]]值的当前值retrieve设置为。它是在调用函数时设置的值(非常类似于this绑定(bind)),并且根据§8.1.1.3 Function Environment Records设置:



因此,一方面,最终使我们能够检测一个函数是否被称为构造函数。

但这不是它的真正目的。那是什么呢?这是ES6类不仅是语法糖,而且还允许我们从内置对象继承的方式的一部分。当您通过class调用new X构造函数时,this值尚未初始化-输入构造函数主体时尚未创建该对象。它确实是在super()调用期间由 super 构造函数创建的(当应该创建内部插槽时这是必需的)。尽管如此,该实例仍应继承自最初调用的构造函数的.prototype,这就是newTarget发挥作用的地方。它确实包含在new调用期间接收到super()调用的“最外层”构造函数。您可以在规范中一直遵循它,但是基本上它始终是newTarget而不是当前执行的构造函数确实会传递到 OrdinaryCreateFromConstructor procedure中-例如在step 5 of §9.2.2 [[Construct]]中用于用户定义的函数。

长文本,也许是一个更适合的示例:

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;

关于javascript - 什么是 “new.target”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32450516/

10-13 06:51