gpt4 book ai didi

javascript - 什么是 "new.target"?

转载 作者:行者123 更新时间:2023-12-01 11:33:01 29 4
gpt4 key购买 nike

ECMAScript 2015 规范提到了关键字(或单词?)新目标 正好 3 次 - 1 次在 14.2.3 :

Normally, Contains does not look inside most function forms However, Contains is used to detect new.target, this, and super usage within an ArrowFunction.



和两次 14.2.16 :

An ArrowFunction does not define local bindings for arguments, super, this, or new.target. Any reference to arguments, super, this, or new.target within an ArrowFunction must resolve to a binding in a lexically enclosing environment



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

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

它是什么,应该如何使用?

最佳答案

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

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

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

If this Environment Record was created by the [[Construct]] internal method, [[NewTarget]] is the value of the [[Construct]] newTarget parameter. Otherwise, its value is undefined.



因此,一方面,finally 使我们能够检测一个函数是否被作为构造函数调用。

但这不是它的真正目的。那么它是什么呢?这是 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com