#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)