задача на прототипы
Добрый день, помогите, пожалуйста найти ошибку и правильно вывести в консоль.
ошибка Uncaught SyntaxError: Identifier 'validDate' has already been declared
function User(name, date) {
this.name = name;
this.date = date;
}
User.prototype.getInfo = function() {
return {
name: this.name,
date: this.date
};
};
function Admin(name, date, isRootAdmin) {
User.apply(this, arguments);
this.getRootProp = function() {
return isRootAdmin;
};
}
Admin.prototype = Object.create(User.prototype);
Admin.prototype.constructor = Admin;
Admin.prototype.getInfo = function() {
const info = User.prototype.getInfo.call(this);
info.isRootAdmin = this.getRootProp();
return info;
};
function Guest(name, date, validDate) {
User.apply(this, arguments);
const validDate = new Date(
this.date.getFullYear(),
this.date.getMonth(),
this.date.getDate() + 7
);
this.getValidDate = function() {
return validDate;
};
}
Guest.prototype = Object.create(User.prototype);
Guest.prototype.constructor = Guest;
Guest.prototype.getInfo = function() {
const info = User.prototype.getInfo.call(this);
info.validDate = this.getValidDate();
return info;
};
const strainger = Guest.getInfo();
console.log(strainger);
|
Задание просто такое
Создать класс “Пользователь” с базовыми свойствами “имя”, “дата регистрации” и методом “получить информацию” (метод должен вывести имя и дату регистрации). Метод должен быть объявлен с помощью прототипов (Func.prototype...) Создать два наследника класса “Пользователь”: класс “Админ” и класс “Гость”. У класса “Админ” должно быть дополнительное свойство “суперАдмин” (может быть true/false, должно быть скрытым). Свойства определяются в момент вызова конструктора. У класса “Гость” должно быть свойство “срокДействия” (validDate, например), содержащее дату (например, одну неделю от момента регистрации). У классов-наследников метод “получить информацию” должен так же содержать информацию о дополнительных свойствах (“суперАдмин” и “срокДействия”) |
return User.prototype.getInfo.call(this) А вот это, наверное, можно как-то заменить, т.к. админ и гость уже унаследовал getInfo от User...? в этом случае придется импортировать User... если все бить на разные файлы |
Rise, спасибо большое!:yes:
|
function User(name, date) {
this.name = name;
this.date = date;
}
User.prototype.getInfo = function () {
return 'Name: "' + this.name + '" Date: "' + this.date + '"';
};
function Admin(name, date, rootAdmin) {
User.call(this, name, date); // ну и тут можно на __proto__ заменить
this.isRootAdmin = function () {
return rootAdmin;
};
}
Admin.prototype = Object.create(User.prototype);
Admin.prototype.constructor = Admin;
Admin.prototype.getInfoAdmin = function () {
// если не переименовать getInfo будет Maximum callstack...
return this.getInfo.call(this) // потому что будет проверять в __proto__, до тех пор пока не __proto__ ))
// return this.__proto__.__proto__.getInfo.call(this) // это работает тоже
// __proto__ раз - Admin, __proto__ два - User
}
const admin = new Admin('n', 'd', true)
console.log(admin.getInfoAdmin())
вообще __proto__ кто-то пользует? просто я пришел в js на es2015... и как-то не особо заморачиваюсь с этим прото и конструктор... потому что webpack сделает как надо, наверное... |
| Часовой пояс GMT +3, время: 17:41. |