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