Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.08.2019, 10:42
Интересующийся
Отправить личное сообщение для Трудяга Посмотреть профиль Найти все сообщения от Трудяга
 
Регистрация: 30.07.2019
Сообщений: 19

задача на прототипы
Добрый день, помогите, пожалуйста найти ошибку и правильно вывести в консоль.

ошибка 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);

Последний раз редактировалось Трудяга, 29.08.2019 в 11:58.
Ответить с цитированием
  #2 (permalink)  
Старый 29.08.2019, 13:09
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 458

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

Последний раз редактировалось Rise, 29.08.2019 в 13:18.
Ответить с цитированием
  #3 (permalink)  
Старый 29.08.2019, 13:26
Интересующийся
Отправить личное сообщение для Трудяга Посмотреть профиль Найти все сообщения от Трудяга
 
Регистрация: 30.07.2019
Сообщений: 19

Задание просто такое

Создать класс “Пользователь” с базовыми свойствами “имя”, “дата регистрации” и методом “получить информацию” (метод должен вывести имя и дату регистрации). Метод должен быть объявлен с помощью прототипов (Func.prototype...) Создать два наследника класса “Пользователь”: класс “Админ” и класс “Гость”.
У класса “Админ” должно быть дополнительное свойство “суперАдмин” (может быть
true/false, должно быть скрытым). Свойства определяются в момент вызова
конструктора.
У класса “Гость” должно быть свойство “срокДействия” (validDate, например), содержащее дату (например, одну неделю от момента регистрации).
У классов-наследников метод “получить информацию” должен так же содержать информацию о дополнительных свойствах (“суперАдмин” и “срокДействия”)
Ответить с цитированием
  #4 (permalink)  
Старый 29.08.2019, 14:41
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 458

Про Гость не сказано что должно быть скрытым. Запомни, глагол это метод, а не свойство.
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());

Последний раз редактировалось Rise, 29.08.2019 в 14:51.
Ответить с цитированием
  #5 (permalink)  
Старый 29.08.2019, 15:23
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

return User.prototype.getInfo.call(this)

А вот это, наверное, можно как-то заменить, т.к. админ и гость уже унаследовал getInfo от User...?

в этом случае придется импортировать User... если все бить на разные файлы
Ответить с цитированием
  #6 (permalink)  
Старый 29.08.2019, 15:44
Интересующийся
Отправить личное сообщение для Трудяга Посмотреть профиль Найти все сообщения от Трудяга
 
Регистрация: 30.07.2019
Сообщений: 19

Rise, спасибо большое!
Ответить с цитированием
  #7 (permalink)  
Старый 29.08.2019, 15:46
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

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 сделает как надо, наверное...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача с циклом while crabkilla Общие вопросы Javascript 1 19.07.2019 13:18
Задача с цветами fillika Events/DOM/Window 3 25.05.2019 00:19
Небольшая задача Всемогущий Общие вопросы Javascript 5 19.04.2019 07:59
Задача c тегом <g> в svg Kosty@n Элементы интерфейса 2 14.01.2013 19:08