先前接受的答案不正确。您可以使用 bind、call 和 apply 构造函数来创建新的构造函数——测试中唯一的问题是您忘记了 bind.apply 和 bind.call 正在应用和调用bind,而不是构造函数本身,所以你给出了错误的论点。
f = Date.bind(null, 2000,0,1)
g = Function.bind.call(Date, null, 2000, 0, 1)
h = Function.bind.apply(Date, [ null, 2000, 0, 1 ])
new f() //=> Sat Jan 01 2000 00:00:00 GMT-0500 (EST)
new g() //=> Sat Jan 01 2000 00:00:00 GMT-0500 (EST)
new h() //=> Sat Jan 01 2000 00:00:00 GMT-0500 (EST)
这三个都是instanceof
日期。
调用的参数是执行上下文,后跟要应用的参数。Apply 的参数是执行上下文和参数数组。Bind 的参数是执行上下文,后跟要绑定的参数。
例如,要应用的参数是应用 绑定的上下文(日期),后跟一个数组,该数组是绑定的参数(因此第一个数组成员是绑定的上下文参数)。这就是调用或应用绑定令人困惑的原因;为两者提供上下文参数感觉很奇怪。
请注意,当使用带有构造函数的绑定时,上下文参数总是被忽略,因为“new”显式地创建了一个新上下文。当上下文参数与保持清晰无关时,我使用 null ,但它可以是任何东西。
同时,这些示例中的 apply 和 call 确实需要知道它们要应用/调用绑定的上下文是 Date 函数。我在可能的情况下将“日期”切换为“功能”,以帮助阐明实际在哪里提供上下文。当我们在 Date.bind 上调用 apply 或调用时,我们实际上是在调用 apply 或调用未附加到 Date 对象的 bind 方法。这种情况下的 bind 方法可能来自任何函数。它可能是 Number.bind.call(Date, null, 2000, 0, 1) 并且结果将完全相同。
如果原因不明显,请考虑以下示例之间的区别:
context.method();
和
var noLongerAMethod = context.method;
noLongerAMethod();
在第二种情况下,该方法已经脱离了它的原始上下文(......除非它以前被绑定)并且如果它在内部依赖“this”将表现不同。当我们将任何给定函数作为属性拉出绑定时,而不是直接执行它,它只是另一个指向 Function.prototype 上的通用绑定方法的指针。
就我个人而言,我认为我从来不需要调用或应用 bind,而且很难想象它会成为一个好的解决方案的情况,但是绑定构造函数以创建新的构造函数是我发现有时非常有用的东西. 无论如何,这是一个有趣的谜题。