It all works like that because that's how the Date object is meant to work.
None of the results you mention are incorrect.
Year:
The getYear() method returns the year minus 1900;
So, for 2015, it returns 2015 - 1900, which is 115. However, getYear is deprecated, use getFullYear instead. (This does return 2015)
Month:
The getMonth() method returns the month in the specified date according to local time, as a zero-based value (where zero indicates the first month of the year).
So, January is 0, February 1, etc.
Day:
The getDay() method returns the day of the week for the specified date according to local time, where 0 represents Sunday.
Basically the same story as months, they're zero-based.
If you want to get the day of the month intead, use getDate()
And finally, the prototype, __proto__ is really something you shouldn't touch. It's no more than a skeleton for a Date object, where the Date object will have it's proper values.
__proto__is the stringification of thedateconstructor anyway. Which is not a dateJan =0, Feb=1, etc.d.__proto__to be?Date.prototype. a) browsers will not yet have adopted this b) it was a rushed decision, one of the last before finalisation, and might have been a mistake. Looking for the first errate list and ES7 :-)