2013-02-26 32 views
0

在下面的代码,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)),但在receving端var toString = Object.prototype.toString;这里代替使用this关键字他们正在使用Object关键字,但仍然得到了正确的答案,我不明白这个概念。任何人都可以帮助我理解这个概念

+0

你是说上面的例子* are * working或* are * working? – 2013-02-26 05:55:06

回答

3

.call用提供的上下文执行一个函数。 var toString = Object.prototype.toStringObjecttoString函数传递给一个变量..我想为方便访问。

然后,您可以使用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(); // '' 
1

我不知道我理解你的问题。但是在这里。

var toString = Object.prototype.toString;

在这一行你正在阅读对象的“原型”财产和阅读原型的“的toString”属性。 toString属性是一个函数。你把它存储在你的变量中。

现在,当你这样做:toString.call(new Date);,你从上面的功能,打算将其应用通过“新日”返回的对象(即在的toString代码this上下文成为通过“新日返回的对象“)

你可以认为这是抄袭属于对象的方法,并应用它的另一个对象。

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值将改变被检查的对象。

当你调用通过Object.prototype.toString。()调用,您可以通过一个新的值被用作this

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

我强烈建议你阅读耶胡达·卡茨”简单的3种方式解释影响的this值调用函数时:

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