javascript call()函数这个上下文

时间:2013-02-26 05:53:34

标签: javascript

在以下代码中,

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关键字但仍然得到了正确的答案,我不明白这个概念。任何人请帮助我理解这个概念

3 个答案:

答案 0 :(得分:3)

.call使用提供的上下文执行函数。 var toString = Object.prototype.toStringObject的{​​{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.toStringObject.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/