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
5 Answers
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);
Comments
The problem is that this, when you call the function, isn't a date but the global context (window).
You may do this :
foo.call(new Date());
Or, if you want to be able to use the function from anywhere and still use the original date, you may use
var date = new Date();
var foo = function() { return date.getDate() }; // returns always the same date
or
var foo = function() { return (new Date()).getDate() }; // returns the current date
If there weren't IE8, you could also use bind :
var foo = date.bind(date);
Proxy, read this: 2ality.com/2016/11/…