задача на прототипы
Добрый день, помогите, пожалуйста найти ошибку и правильно вывести в консоль.
ошибка 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); |
getInfo здесь вообще не в тему, сам по себе экземпляр класса это уже и есть то самое Info, также не понятно зачем аргумент validDate, ну и в User.call не надо все arguments, а только отнаследованные.
function User(name, date) { this.name = name; this.date = date; } function Admin(name, date, isRootAdmin) { User.call(this, name, date); this.isRootAdmin = isRootAdmin; } Admin.prototype = Object.create(User.prototype); Admin.prototype.constructor = Admin; function Guest(name, date) { User.call(this, name, date); this.validDate = new Date(date.getTime()); this.validDate.setDate(date.getDate() + 7); } Guest.prototype = Object.create(User.prototype); Guest.prototype.constructor = Guest; var guest = new Guest('Guest1', new Date); console.log(guest); И это старая школа, а const это новая и там есть class: class User { constructor(name, date) { this.name = name; this.date = date; } } class Admin extends User { constructor(name, date, isRootAdmin) { super(name, date); this.isRootAdmin = isRootAdmin; } } class Guest extends User { constructor(name, date) { super(name, date); this.validDate = new Date(date.getTime()); this.validDate.setDate(date.getDate() + 7); } } let guest = new Guest('Guest1', new Date); console.log(guest); |
Задание просто такое
Создать класс “Пользователь” с базовыми свойствами “имя”, “дата регистрации” и методом “получить информацию” (метод должен вывести имя и дату регистрации). Метод должен быть объявлен с помощью прототипов (Func.prototype...) Создать два наследника класса “Пользователь”: класс “Админ” и класс “Гость”. У класса “Админ” должно быть дополнительное свойство “суперАдмин” (может быть true/false, должно быть скрытым). Свойства определяются в момент вызова конструктора. У класса “Гость” должно быть свойство “срокДействия” (validDate, например), содержащее дату (например, одну неделю от момента регистрации). У классов-наследников метод “получить информацию” должен так же содержать информацию о дополнительных свойствах (“суперАдмин” и “срокДействия”) |
Про Гость не сказано что должно быть скрытым. Запомни, глагол это метод, а не свойство.
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); this.isRootAdmin = function () { return rootAdmin; }; } Admin.prototype = Object.create(User.prototype); Admin.prototype.constructor = Admin; Admin.prototype.getInfo = function() { return User.prototype.getInfo.call(this) + ' rootAdmin: ' + this.isRootAdmin(); }; function Guest(name, date) { User.call(this, name, date); this.validDate = new Date(date.getTime()); this.validDate.setDate(date.getDate() + 7); } Guest.prototype = Object.create(User.prototype); Guest.prototype.constructor = Guest; Guest.prototype.getInfo = function() { return User.prototype.getInfo.call(this) + ' validDate: "' + this.validDate + '"'; }; var user = new User('User1', new Date(2019, 7, 20)); alert(user.getInfo()); var admin = new Admin('Admin1', new Date(2019, 7, 25), true); alert(admin.getInfo()); var guest = new Guest('Guest1', new Date); alert(guest.getInfo()); |
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, время: 00:50. |