You first need to understand how the value of this changes depending on how a function is invoked.
First up, we have member functions. Object.prototype.toString is a member function of Object.prototype. You could visualise this simply as:
Object.prototype = {
toString: function() {} // is responsible for converting an object to it's string representation
};
When a member function is invoked, the context of this refers to the parent object (the instance of Object). As builtin JS objects extend Object, they are all able to use .toString() with varying results:
(new Object).toString(); // [object Object]
(new String).toString(); // [object String]
It helps to imagine the inner workings of .toString(), you'd imagine it might do something like:
// ..
return '[object '+ this.constructor.name + ']';
// ..
Hopefully you can now imagine how changing the value of this in the function will change the object that is being inspected.
When you invoke Object.prototype.toString via .call(), you are able to pass a new value to be used as this:
Object.prototype.toString.call(new Date); // [object Date]
I highly recommend reading Yehuda Katz' simple explanation of the 3 ways to affect the value of this when invoking a function:
http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/