Answer the question
In order to leave comments, you need to log in
Date inheritance?
Hello, tell me please.
When I create my class and inherit with new syntax then everything works
class SpaceDate extends Date { }
let dateOriginal = new SpaceDate(2017, 1, 22);
console.log( dateOriginal.getDay() ); // 3
console.log( dateOriginal instanceof SpaceDate); // true
const SpaceDate = function( ...args ) {
Date.call( this, ...args );
}
SpaceDate.prototype = Object.create( Date.prototype )
SpaceDate.prototype.constructor = SpaceDate;
let dateOriginal = new SpaceDate(2017, 1, 22);
console.log( dateOriginal instanceof SpaceDate);
console.log( dateOriginal.getDay() );
Uncaught TypeError: this is not a Date object.
"use strict";
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _possibleConstructorReturn(self, call) {
if (!self) {
throw new ReferenceError(
"this hasn't been initialised - super() hasn't been called"
);
}
return call && (typeof call === "object" || typeof call === "function")
? call
: self;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError(
"Super expression must either be null or a function, not " +
typeof superClass
);
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
enumerable: false,
writable: true,
configurable: true
}
});
if (superClass)
Object.setPrototypeOf
? Object.setPrototypeOf(subClass, superClass)
: (subClass.__proto__ = superClass);
}
var SpaceDate = (function(_Date) {
_inherits(SpaceDate, _Date);
function SpaceDate() {
_classCallCheck(this, SpaceDate);
return _possibleConstructorReturn(
this,
(SpaceDate.__proto__ || Object.getPrototypeOf(SpaceDate))
.apply(this, arguments)
);
}
return SpaceDate;
})(Date);
var dateOriginal = new SpaceDate(2017, 1, 22);
console.log(dateOriginal instanceof SpaceDate);
console.log(dateOriginal.getDay());
Answer the question
In order to leave comments, you need to log in
The problem is that in the methods of the Date prototype there is a check that a date instance has been passed. Moreover, the verification does not go along the chain of prototypes.
Old V8 source code :
function DateGetTime() {
CHECK_DATE(this);
return UTC_DATE_VALUE(this);
}
function SpaceDate(...args) {
var date;
date = new Date(...args);
date.__proto__ = SpaceDate.prototype;
return date;
}
SpaceDate.prototype.__proto__ = Date.prototype;
SpaceDate.prototype.test = function() {
return this;
};
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question