questions:
Any idea why this does not work in Chrome?
var foo = (new Date).getDate;
foo();
I get a TypeError: this is not a Date object. However (new Date).getDate() works
answer:
in JavaScript, the this context is not bound to each method of an object. Rather, it is determined at run-time by the way you call that method Check this answer for more about the binding behaviour…
In your code, foo receives the getDate property of new Date, which it receives from the Date.prototype through the prototype chain. Thus, your code is really equivalent to:
var foo = Date.prototype.getDate;
foo();
(Test this yourself: verify in your console that (new Date).getDate === Date.prototype.getDate is indeed true.)
Now, it should be clear that there’s no actual this context for that call. You could set it up beforehand by manually binding the function to an object. (Note: older browsers need a shiv for Function.prototype.bind.)
var foo = Date.prototype.getDate.bind(new Date);
foo();
Alternatively, set up the proper this context when you call/apply the function.
var foo = Date.prototype.getDate;
foo.call(new Date);