Проблема в том, что в методах прототипа
Date идет проверка на то, что передан экземпляр даты. Причем проверка идет не по цепочке прототипов.
Старый
исходный код V8:
function DateGetTime() {
CHECK_DATE(this);
return UTC_DATE_VALUE(this);
}
Кто-то писал, что
CHECK_DATE имеет следующую реализацию:
CHECK_DATE(arg) = (%_ClassOf(arg) === 'Date' ? %_ValueOf(arg) : ThrowDateTypeError());
Тем не менее, сейчас все это переписано на
C++.
Если посмотреть
спецификацию, то видно, что методы прототипа вызывают нативные функции, выполняющие все расчеты и тут важно, чтобы им предавали валидный объект даты. Поэтому, видимо, и идет строгая проверка.
Вариант решения этой проблемы, изменить цепочку прототипов экземпляра:
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;
};
Возвращаться будет объект
Date, а цепочка прототипов будет с вашими методами. На прототип оригинального объекта
Date это никак не повлияет.