0

在下面的代码中,

var toString = Object.prototype.toString;

toString.call(new Date); // [object Date]
toString.call(new String); // [object String]
toString.call(Math); // [object Math]

在调用中,当前对象像 ( toString.call(new Date)) 一样传递,但是在这里的接收端 var toString = Object.prototype.toString;不是使用this关键字,而是使用Object关键字,但仍然得到正确的答案我不理解这个概念。任何人请帮助我理解这个概念

4

3 回答 3

3

.call使用提供的上下文执行函数。将'函数var toString = Object.prototype.toString传递给变量.. 我想是为了方便访问。ObjecttoString

然后,您可以使用提供的上下文toString.call([new context here])调用对象的方法。toString如您所见,这将打印[object OBJECTNAME]为字符串。

ObjecttoString其他一些不同。例如:

(new Date).toString(); // "Tue Feb 26 2013 01:00:17 GMT-0500 (EST)"
(new String).toString(); // ''
于 2013-02-26T06:00:22.617 回答
1

我不确定我是否理解你的问题。但是这里。

var toString = Object.prototype.toString;

在这一行中,您正在阅读 Object 的“prototype”属性并阅读原型的“toString”属性。toString 属性是一个函数。您将其存储在变量中。

现在,当您这样做时:toString.call(new Date);,您从上面获取该函数并将其应用于“new Date”返回的对象(即thistoString 中代码的上下文成为“new Date”返回的对象)

您可以将其视为复制属于某个对象的方法并将其应用于另一个对象。

于 2013-02-26T06:02:29.677 回答
1

您首先需要了解如何this根据调用函数的方式更改值。

首先,我们有成员函数。Object.prototype.toString是 的成员函数Object.prototype。您可以将其简单地想象为:

Object.prototype = {
    toString: function() {} // is responsible for converting an object to it's string representation
};

当调用成员函数时,上下文this引用父对象(的实例Object)。随着内置 JS 对象的扩展Object,它们都可以使用.toString()不同的结果:

(new Object).toString(); // [object Object]
(new String).toString(); // [object String]

它有助于想象 的内部运作.toString(),你会想象它可能会做类似的事情:

// ..
return '[object '+ this.constructor.name + ']';
// ..

希望您现在可以想象更改this函数中的值将如何更改正在检查的对象。

当您Object.prototype.toString通过 .call() 调用时,您可以传递一个新值用作this

Object.prototype.toString.call(new Date); // [object Date]

this我强烈推荐阅读 Yehuda Katz 对调用函数时影响值的 3 种方式的简单解释:

http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/

于 2013-02-26T06:04:35.457 回答