什么是javascript Reflect.construct newTarget在做什么

时间:2018-05-15 09:09:24

标签: javascript

当我正在阅读this时,它告诉我"给定目标的一个新实例,通过调用它(或newTarget,如果存在)创建为具有给定参数的构造函数。&#34 ;但实际上,情况并非如此。这是一个例子:

function Parent() {
  this.parent = "Parent"
  console.log("This is parent.")
}
function Child() {
  this.child = "Child"
  console.log("This is child.")
}
var result = Reflect.construct(Parent, [], Child);
console.log(result)

输出如下:

enter image description here

这对我来说是如此奇怪,因为基于doc,当我们将Child作为新的目标参数放在Reflect.construct中时,它应该使用Child的构造函数来创建一个新实例,但是日志显示"这是父母。"打印并保存Parent的属性,同时构造函数是Child()。怎么可能这样呢?有人可以解释一下幕后发生的事情吗?这让我发疯,我真的想知道javascript是如何做到这一点的。非常感谢你们。

1 个答案:

答案 0 :(得分:0)

我会说这些文档有些误导性的措辞。似乎正在发生的是construct()调用第一个参数作为构造函数(即初始化对象),但使用最后一个参数作为原型(即对象的实际“类”)。在您的情况下,result instanceof Child返回true,但result instanceof Parent返回false。

因此,Reflect.construct(target, args, newTarget)的结果似乎与此相同:

var result = Object.create(newTarget.prototype);
target.apply(result, args);

但是,有一个显着差异:在上面的示例中,任一函数中的new.target运算符都将返回undefined,因为您没有使用new关键字来创建宾语。另一方面,当您使用Reflect.construct()时,new.target将指向newTarget(因此我认为这个名称) - 可能是因为最终产生的对象属于那个班。

(注意:我已经请求编辑关于Reflect.construct()的MDN页面以包含这些详细信息)