Не работает наследование даты прототипа объекта

#javascript #date #inheritance #prototype

#javascript #Дата #наследование #прототип

Вопрос:

Учитывая, что это работает.

Прототип:

 function A(color){
 this.color = color
}

A.prototype.test = function(){
 return this.color
}
 

Наследование:

 function B(){
 A.call(this)
}

B.prototype = Object.create(A.prototype)
B.prototype.constructor = B

B.prototype.test2 = function(){
 return 'whatever...'
}
 

Экземпляр:

 const inst = new B(black)
console.log(inst.test()) //black
console.log(inst.test2()) //whatever...
 

Потому что это не работает.

Наследование объекта даты:

 function A(){
 Date.call(this)
}

A.prototype = Object.create(Date.prototype)
A.prototype.constructor = A

A.prototype.test = function(){
 return 'whatever...'
}
 

Экземпляр:

 console.log(new A().getDay()) //Uncaught TypeError: this is not a Date object.
console.log(new A().test()) //whatever...
 

Я попытался наследовать с помощью синтаксиса класса, и он работает идеально, но не то, что я хочу

Наследование объекта даты с помощью класса:

 class A extends Date {
 constructor(){
  super()
 }
 test(){
  return 'whatever...'
 }
}
 

Экземпляр:

 console.log(new A().getDay()) //3
console.log(new A().test()) //whatever...
 

Он работает идеально, но я не хочу использовать синтаксис класса.

Комментарии:

1. » Учитывая, что это работает «, нет, это не так, он выдает ошибку ссылки, потому что цвет не определен.

2.Методы Date.prototype работают только с экземплярами Date в соответствии с ECMA-262: «Если явно не определено иное, методы объекта прототипа даты, определенные ниже, не являются универсальными, и переданное им значение this должно быть объектом, который имеет внутренний слот [[DateValue]], который был инициализированк значению времени.» Вы не можете превратить обычный объект в объект даты, просто назначив Date.prototype его внутреннему [[prototype]] .

3. О, и вызов конструктора даты как функции просто возвращает строку, представляющую текущую дату и время, как для new Date().toString() , поэтому Date.call(this) ничего не изменяет значение, переданное как this , и new A() просто возвращает экземпляр A.

4. Я забыл изменить «porp» на «color», теперь он отредактирован. Есть ли у вас какие-либо идеи, как заставить это работать? Если он работает с синтаксисом класса, он также должен работать в другую сторону.

5. function A(...args) { return Reflect.construct(Date, args, new.target) } A.prototype.diff = function() { return alert(this.getTime()); }; Reflect.setPrototypeOf(A.prototype, Date.prototype)