当前位置: 首页 > 面试题库 >

什么是“新目标”?

封永嘉
2023-03-14
问题内容

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

通常,Contains不会在大多数函数形式中查找,但是,Contains用于检测 ArrowFunction中的new.target
,this和super用法。

在14.2.16中两次:

ArrowFunction没有为参数,super,this或 new.target 定义本地绑定。 ArrowFunction中
对参数,super,this或 new.target的 任何引用 都必须解析为词法包围环境中的绑定

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

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

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


问题答案:

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

NewTarget是第一个所谓的元属性,可以在§12.3.8中找到。

其唯一目的是检索当前(非箭头)功能环境的[[NewTarget]]值的当前值。它是在调用函数时(非常类似于this绑定)并根据[§8.1.1.3 函数环境记录设置的值]:

如果此环境记录是通过 [[Construct]]内部方法创建的,则[[NewTarget]]是[[Construct]]newTarget参数的值。否则,其值为undefined

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

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

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

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;


 类似资料:
  • 我有一个与YouTube直播API集成的程序。它运行在计时器上,所以我相对容易编程,每50分钟用一个刷新令牌获取一个新的访问令牌。我的问题是,为什么? 当我使用 YouTube 进行身份验证时,它给了我一个刷新令牌。然后,我使用此刷新令牌大约每小时获取一次新的访问令牌。如果我有刷新令牌,我可以随时使用它来获取新的访问令牌,因为它永远不会过期。因此,我认为这比从一开始就给我一个访问令牌而不打扰整个刷

  • 我几天前听说了Docker的事,想过去看看。 但事实上,我不知道这个“容器”的用途是什么? 什么是容器? 它能取代一个专门用于开发的虚拟机吗? 简单地说,在公司中使用Docker的目的是什么?主要的优势?

  • 我正在尝试创建我的第一个Spring Boot应用程序。我在这里使用的是: 然而,eclipse抱怨说: 没有为此构建指定目标。您必须以

  • 我正在弄清楚如何使用Cocoapods,我发现了这个:pod install在cocoapods版本1.0.0.beta.1中显示错误 它说我必须写以下行:后面跟一些东西。但我对什么是我的“TargetName”感到困惑。 例如,此项目中的目标名称是什么: 或者,我在哪里可以找到我的项目的“目标”?我正在使用最新版本的Xcode。

  • 问题内容: 如果可能,如何举例说明如何实现JNDI的用法? 问题答案: JNDI是Java命名和目录接口。它用于分离应用程序 开发人员 和应用程序 部署 人员 的关注点。在编写依赖于数据库的应用程序时,无需担心用于连接该数据库的用户名或密码。JNDI允许开发人员为数据库命名,并依靠部署者将该名称映射到数据库的实际实例。 例如,如果您要编写在Java EE容器中运行的代码,则可以编写此代码来获取JN

  • 本文向大家介绍什么是盲目签名?相关面试题,主要包含被问及什么是盲目签名?时的应答技巧和注意事项,需要的朋友参考一下 回答:** 盲签名是密码术中数字签名的一种形式,其中消息的内容在签名或考虑之前是盲的。它主要用于作者和签名方不同的隐私相关协议中。这是一种经过验证的方法。 例如:数字现金计划