为什么在JavaScript中使用apply方法和直接调用函数会得到不同的结果?

4
我有以下代码。
var d = new Date();
Object.prototype.toString(d); //outputs  "[object Object]"
Object.prototype.toString.apply(d); //outputs "[object Date]"

为什么会有这样的差异,发生了什么事情呢?
编辑:
d.toString() // outputs "Tue Nov 06 2012 ..."

那么,“[object Date]”中的日期是从哪里来的呢?它是浏览器的原生代码完成的吗?
3个回答

4
Object.prototype.toString(d);

Object.prototype转换为字符串并忽略其参数。在

Object.prototype.ToString.apply(d);
d作为this传递给ToString方法(就像调用Object.prototype.toStringd.toString()一样),这就是该方法所遵循的原则。
请参见Function#applyObject#toString

是的,因为在这种情况下,您调用的是 Date.prototype.toString,而不是 Object.prototype.toString(即日期实例继承了不同的toString方法)。 - RobG

3

第一次调用将忽略该参数。您正在调用 Object.prototype 对象上的 toString 方法,基本上相当于:

{}.toString(); //outputs  "[object Object]"

在第二次调用中,您正在调用 Object toString 方法,但将 Date 对象应用为其上下文。该方法返回对象的类型作为字符串,而不是 Date 对象的 toString 方法,后者将返回 Date 对象的值作为字符串。

1
另一个解释是{{link1:Object.prototype.toString}}作用于它的this对象。函数的this是由你调用它的方式来设置的,所以当你这样做时:
Object.prototype.toString();

toString 函数的 thisObject.prototype 对象。当你这样调用它时:

Object.prototype.toString.apply(d);

this 是由 d(一个日期对象)引用的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接