Javascript [[call]]和[[construct]]之间有什么区别?

Javascript [[call]]和[[construct]]之间有什么区别?,javascript,Javascript,使用new调用构造函数时,不能直接使用数组和apply(apply执行[[Call]],而不是[[Construct]])。但是,由于扩展语法,数组可以轻松地与新的数组一起使用 var dateFields = [1970, 0, 1]; // 1 Jan 1970 var d = new Date(...dateFields); 那么为什么我们不能使用apply for构造函数呢? 调用和构造之间有什么区别吗?[[call]]是通过日期(…)调用的,而[[construct]]是通过新日期

使用new调用构造函数时,不能直接使用数组和apply(apply执行[[Call]],而不是[[Construct]])。但是,由于扩展语法,数组可以轻松地与新的数组一起使用

var dateFields = [1970, 0, 1];  // 1 Jan 1970
var d = new Date(...dateFields);
那么为什么我们不能使用apply for构造函数呢?
调用和构造之间有什么区别吗?

[[call]]是通过
日期(…)
调用的,而[[construct]]是通过
新日期(…)
调用的。如果您试图通过
new Date.apply(…,dateFields)
来[[Construct]]一个
Date
,它实际上调用了
函数.prototype.apply上的[[Construct]],而不是
Date
对象,后者不会正确初始化
Date
对象,而是尝试使用[[Prototype]]等于
apply。Prototype
未定义,因为
apply()
不是可构造的函数,因此抛出
TypeError


为了澄清,我并不是说在ES5中不可能将参数数组应用于
Date
构造函数,我只是解释为什么要将
apply
应用于[[Construct]]
Date
将不起作用。

构造函数使用
this
访问构造的对象,您可以使用
apply
的第一个参数轻松模拟它,因此[[Construct]]基本上只是一个具有不同上下文的[[Call]]:

var obj = Object.create(Date.prototype);
Date.apply(obj, dateFields);
如果您想要ES6版本,有一个全新的方法可以直接调用[[construct]]:

var obj = Reflect.construct(Date, dateFields);

抱歉,不清楚您的问题的核心是什么。请为故事的两个方面发布代码。您所说的构造函数示例是什么意思?没有
Reflect.construct
?@JonasW。这也是ES6。同样的问题。apply的作用是,它将参数列表作为数组并传递它们。请参阅