在以下代码中,
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
关键字但仍然得到了正确的答案,我不明白这个概念。任何人请帮助我理解这个概念
答案 0 :(得分:3)
.call
使用提供的上下文执行函数。 var toString = Object.prototype.toString
将Object
的{{1}}函数传递给变量..我想方便访问。
然后,您可以使用toString
使用提供的上下文调用Object的toString.call([new context here])
方法。如您所见,这会将toString
打印为字符串。
[object OBJECTNAME]
的{{1}}与其他人不同。例如:
Object
答案 1 :(得分:1)
我不确定我理解你的问题。但是这里有。
var toString = Object.prototype.toString;
在这一行中,您正在读取Object的“prototype”属性并读取原型的“toString”属性。 toString属性是一个函数。您将其存储在变量中。
现在,当您执行此操作时:toString.call(new Date);
,您从上面获取该函数并将其应用于“new Date”返回的对象(即to {String中的代码的this
上下文变为“新日期”返回的对象
您可以将此视为复制属于对象的方法并将其应用于其他对象。
答案 2 :(得分: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
的值将更改正在检查的对象。
当您通过.call()调用Object.prototype.toString
时,您可以传递一个新值以用作this
:
Object.prototype.toString.call(new Date); // [object Date]
我强烈建议阅读Yehuda Katz对调用函数时影响this
值的3种方法的简单解释:
http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/