Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.05.2021, 15:17
Аватар для deGeneral
Интересующийся
Отправить личное сообщение для deGeneral Посмотреть профиль Найти все сообщения от deGeneral
 
Регистрация: 27.11.2019
Сообщений: 10

Нюансы прототипного наследования
Всех приветствую!

Ковыряясь в дебрях прототипного наследования, набрел на такую интересную особенность. Вот, например:

function Boss() {
    this.id = 0;
    this.desc = 'Main object'
}

const boss = new Boss();

function SubBoss() {
    this.department = 1;
}
SubBoss.prototype = boss;

subBoss = new SubBoss();

console.dir(SubBoss);
console.log(subBoss);
console.log(subBoss.desc);


Два объекта заданы своими функциями-конструкторами, экземпляры этих объектов - соответственно, через new. Объект SubBoss я хочу прототипно связать с объектом Boss и у меня вопрос: почему для этого я должен обязательно создать экземпляр объекта Boss (boss) и записать в прототип его? А просто связать две функции-конструктора прототипно не судьба? Если я просто напишу SubBoss.prototype = Boss, то последняя строка выдаст в консоль undefined, а свойство subBoss.desc должно унаследоваться.

Что примечательно, если рассмотреть в консоли console.dir(SubBoss), то там в prototype будет записано Boss, а не boss.

Запутался я, в общем, в этих хитросплетениях, помогите наконец-то уложить все это в голове.
Ответить с цитированием
  #2 (permalink)  
Старый 19.05.2021, 16:31
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от deGeneral
А просто связать две функции-конструктора прототипно не судьба?
Не по адресу вопрос...
Это тебе нужно обращаться к отцам JS со своими претензиями.
Не нравятся функции-конструкторы - используй class, там наследование синтаксически не так оформляется.

А с функциями вот такой синтаксис.
Ответить с цитированием
  #3 (permalink)  
Старый 19.05.2021, 18:09
Аватар для deGeneral
Интересующийся
Отправить личное сообщение для deGeneral Посмотреть профиль Найти все сообщения от deGeneral
 
Регистрация: 27.11.2019
Сообщений: 10

То есть, почему это именно так, неизвестно, это просто так и все.
Жаль, люблю декларативность, ничего не могу с собой поделать!

Последний раз редактировалось deGeneral, 19.05.2021 в 18:14.
Ответить с цитированием
  #4 (permalink)  
Старый 19.05.2021, 20:04
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от deGeneral
почему для этого я должен обязательно создать экземпляр объекта Boss (boss) и записать в прототип его?
как раз именно это и не надо делать.

правильная сборка:
function Boss() {
    this.id = 0;
    this.desc = 'Main object'
}

function SubBoss() {
    Boss.call(this);
    this.department = 1;
}
SubBoss.prototype = Object.create(Boss.prototype);
SubBoss.prototype.constructor = SubBoss

subBoss = new SubBoss();

console.dir(SubBoss);
console.log(subBoss);
console.log(subBoss.desc);
Ответить с цитированием
  #5 (permalink)  
Старый 19.05.2021, 21:23
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от deGeneral
люблю декларативность, ничего не могу с собой поделать!
Вот еще статейку на эту тему нашел...
https://habr.com/ru/post/131714/
Ответить с цитированием
  #6 (permalink)  
Старый 19.05.2021, 22:03
Аватар для deGeneral
Интересующийся
Отправить личное сообщение для deGeneral Посмотреть профиль Найти все сообщения от deGeneral
 
Регистрация: 27.11.2019
Сообщений: 10

Сообщение от Alexandroppolus Посмотреть сообщение
как раз именно это и не надо делать.

правильная сборка:
function Boss() {
    this.id = 0;
    this.desc = 'Main object'
}

function SubBoss() {
    Boss.call(this);
    this.department = 1;
}
SubBoss.prototype = Object.create(Boss.prototype);
SubBoss.prototype.constructor = SubBoss

subBoss = new SubBoss();

console.dir(SubBoss);
console.log(subBoss);
console.log(subBoss.desc);
Спасибо, интересно. Не встречал такого способа связывания ранее.
Ответить с цитированием
  #7 (permalink)  
Старый 19.05.2021, 22:04
Аватар для deGeneral
Интересующийся
Отправить личное сообщение для deGeneral Посмотреть профиль Найти все сообщения от deGeneral
 
Регистрация: 27.11.2019
Сообщений: 10

Сообщение от ksa Посмотреть сообщение
Вот еще статейку на эту тему нашел...
https://habr.com/ru/post/131714/
Спасибо, разберу на молекулы.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JavaScript Используя иерархию и наследования, создать классы окна, окна с заголовком Forever_smile Internet Explorer 2 24.03.2021 23:38
Особенности прототипного наследования. alexsm993 Общие вопросы Javascript 2 29.09.2019 22:12
Постижение прототипного наследования. Подтвердите догадку ) AndryG Общие вопросы Javascript 14 15.06.2016 21:30
Помогите с пониманием наследования deivan Общие вопросы Javascript 10 21.11.2012 17:35
Раскроем все нюансы темы "Способы идентификации в интернете" Kovboy_Marlboro Общие вопросы Javascript 4 27.03.2012 21:58