Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Прототипное наследование (https://javascript.ru/forum/misc/72540-prototipnoe-nasledovanie.html)

Andrew K 05.02.2018 19:11

Прототипное наследование
 
Здравствуйте! Я работаю с прототипным наследованием и столкнулся с делеммой при задании свойства прототипа.

Есть объект parent и конструктор Child. Child использует parent как прототип. Если я задаю свойство в Child.prototype, то оно, естественно, появляется и в объекте parent:
let parent = { };

function Child() { }
Child.prototype = parent;

Child.prototype.num = 2;

let child = new Child();

console.log( parent.num ); // 2

Мне нужно чтобы я мог задавать свойства в прототипе, но при этом чтобы объект parent не изменялся. Конечно можно задать свойство как свойство объекта child:
function Child (){
    this.num = 2;
}

Но это не экономно по памяти если я создам множество объектов child. Поэтому я хочу, чтобы свойство бралось из прототипа, но при этом чтобы объект parent не изменялся.

Andrew K 05.02.2018 19:18

У меня есть мысль сделать объект-прослойку между parent и Child где будут храниться свойства и методы Child. Наследование будет таким: parent -> childProto -> Child. При изменении прототипа Child объект parent не будет затронут, но зато можно брать его свойства. И не будет перерасхода памяти при создании множества объектов из конструктора Child. Но я не уверен оптимален ли такой ход.

j0hnik 05.02.2018 20:09

Создайте доп. класс
https://youtu.be/4oudziatkLI?t=334

Alexandroppolus 05.02.2018 20:10

Цитата:

Сообщение от Andrew K
Мне нужно чтобы я мог задавать свойства в прототипе, но при этом чтобы объект parent не изменялся.

Child.prototype = Object.create(parent); // вместо Child.prototype = parent;

Andrew K 06.02.2018 07:34

Спасибо за подсказку! Работает как требовалось.

Всегда считал, что Object.create() это еще один способ указать прототип наравне с обычным присваиванием вида Child.prototype = parent. Но оказывается при таком способе parent можно только читать, без возможности изменения.


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