什么是“新目标”
What is "new.target"?
ECMAScript 2015规范提到关键字new。目标正好3次- 1次在14.2.3:
通常情况下,Contains不会查看大多数函数形式的内部。Contains用于检测new。Target 、this和super在对象中的用法ArrowFunction .
和14.2.16中的两次:
ArrowFunction没有为arguments、super、this或new.target。任何对参数,super, this, or的引用新。ArrowFunction中的target必须解析为类中的绑定词法封闭环境
MDN提到了它,但非常模糊,页面不完整。
Babel似乎不支持它。当尝试使用new时,我得到了语法错误。函数中的目标(箭头或其他)。
它是什么,它应该如何使用?
您在规范中找不到它,因为在语法定义中它是用空白书写的,如new . target
。这个表达式的名字是NewTarget
,你会发现这个词出现了好几次。
NewTarget是第一个所谓的元属性,可以在§12.3.8中找到。
它的唯一目的是检索当前(非箭头)函数环境的[[NewTarget]]值的当前值。它是一个函数被调用时设置的值(非常像this
绑定),并且根据§8.1.1.3 函数环境记录:
如果此环境记录是由[[Construct]]内部方法创建的,则[[NewTarget]]是[[Construct]]
newTarget
参数的值。否则为undefined
。
因此,首先,最终使我们能够检测一个函数是否被作为构造函数调用。
但这不是它的真正目的。那么它是什么呢?这是ES6类不仅是语法糖的一部分,也是它们允许我们继承内置对象的一部分。当你通过new X
调用class
构造函数时,this
的值还没有初始化——当进入构造函数体时,对象还没有被创建。它确实是在super()
调用期间由超级构造函数创建的(这在应该创建内部槽时是必要的)。但是,实例应该继承最初调用的构造函数的.prototype
,这就是newTarget发挥作用的地方。它保留在super()
调用期间接收new
调用的"最外层"构造函数。你可以在规范中一直遵循它,但基本上它总是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;
这主要是为了更好地检测没有new
的构造函数何时被调用。
:
new.target
是所有函数都具有的隐式形参。它对构造函数调用的作用就像this
对方法调用的作用一样。
所以我可以写:
function Foo() {
if (!new.target) throw "Foo() must be called with new";
...
}
有更多的细节来说明它是如何工作的,以及它在更多的上下文中是有用的,但我们就到此为止。
有关new.target
的会议记录,请参见https://esdiscuss.org/notes/2015-01-27
- 为什么HTML5拖放的目标是孩子?(可排序列表)
- 如何覆盖锚点元素's href目标,并在我点击转到目标javascript时删除其他错误
- 对一个对象使用reduce可以返回一个没有't在数组中包含目标字母
- Href:当前DIV中的目标ID
- 当使用extern和目标JavaScript时,我如何强制Haxe编译器使用require语句
- 在加载新的AJAX时,同位素容器不以新对象为目标,而是与旧对象重叠
- wordpress在新窗口中打开链接;目标“;属性未设置
- 创建一个新的maven目标来运行jasmine测试
- 如何添加新目标
- XMLHttpRequest POST并在新窗口/选项卡中打开目标页面
- 为什么javascript触发提交表单(方法get,目标空白)打开弹出窗口而不是新选项卡
- 什么是“新目标”
- 在新的窗口打开页面,没有弹出阻止使用JavaScript目标_blank
- Javascript窗口.打开在新窗口和同一窗口中打开目标URL
- HTML表单目标使用jquery的新窗口
- 如何在浏览器上捕获目标网址的新选项卡
- Window.open + href 替换并弹出到新窗口中,但不使用目标_blank
- Flash新影片剪辑目标代码
- 使用Google Closure(或纯Javascript)将KeyHandler事件分派到新的DOM目标
- 如何在新旧目标位置之间平滑地平移