You seem to neglect the fact
window.toString === Object.prototype.toString; // false
The toString window is implementation-specific, and there is nothing in the specification that says that methods on Host DOM objects should work with call / on other / etc objects
If you want to capture this toString but cannot accept the prototype, try
var toString = ({}).toString; toString.call({});
You can also consider skipping a call each time by wrapping it or using bind
var toString = function (x) { return ({}).toString.call(x); }; toString(10);
source share