Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Нюансы прототипного наследования (https://javascript.ru/forum/misc/82523-nyuansy-prototipnogo-nasledovaniya.html)

deGeneral 19.05.2021 15:17

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

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

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.

Запутался я, в общем, в этих хитросплетениях, помогите наконец-то уложить все это в голове.

ksa 19.05.2021 16:31

Цитата:

Сообщение от deGeneral
А просто связать две функции-конструктора прототипно не судьба?

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

А с функциями вот такой синтаксис.

deGeneral 19.05.2021 18:09

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

Alexandroppolus 19.05.2021 20:04

Цитата:

Сообщение от 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);

ksa 19.05.2021 21:23

Цитата:

Сообщение от deGeneral
люблю декларативность, ничего не могу с собой поделать!

Вот еще статейку на эту тему нашел...
https://habr.com/ru/post/131714/

deGeneral 19.05.2021 22:03

Цитата:

Сообщение от Alexandroppolus (Сообщение 536855)
как раз именно это и не надо делать.

правильная сборка:
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);

Спасибо, интересно. Не встречал такого способа связывания ранее.

deGeneral 19.05.2021 22:04

Цитата:

Сообщение от ksa (Сообщение 536857)
Вот еще статейку на эту тему нашел...
https://habr.com/ru/post/131714/

Спасибо, разберу на молекулы.


Часовой пояс GMT +3, время: 20:37.