1 Востаннє редагувалося Yola (18.02.2017 18:07:04)

Тема: Щоб спадкування працювало з об'єктами класу створеними до ланцюжка про

Як зробити, щоб спадкування працювало з об'єктами класу створеними до ланцюжка прототипів?

function Shape() {
   this.name = 'Фігура';
   this.toString = function() { return this.name; }
};
function Shape2D() {
   this.name = '2D Фігура';
};
let before = new Shape2D();
Shape2D.prototype = new Shape();
let after = new Shape2D();
before.name;       // "2D Фігура"
before.toString(); // "[object Object]"
after.name;        // "2D Фігура"
after.toString();  // "2D Фігура"

Хочу, щоб для before теж викликалась перевизначена toString. І для всіх інших раніше створених об'єктів також.

Загалом, я не зрозумів, що робить цей рядок:

Shape2D.prototype = new Shape();

Мені цікаво куди, що посилалось до цього і куди після цього.

2

Re: Щоб спадкування працювало з об'єктами класу створеними до ланцюжка про

let before = new Shape2D();

Об’єкти, які створенні за допомогою конструктора, успадковують властивості батьківського конструктора та прототипу Object.prototype. При цьому пріоритет мають властивості конструктора. 

Shape2D.prototype = new Shape();

Тут ти присвоюєш прототипу наслідування з нового конструктора і надаєш йому найвищу пріоритетність, прицьому властивість "name" в об’єкті Shape2D - є власною , а не спадковою, тому вона має вищій пріоритет ніж та ж властивість з прототипу.

Хочу, щоб для before теж викликалась перевизначена toString. І для всіх інших раніше створених об'єктів також.

Можна створити або перезаписати властивості оригінала об’єкта, але не можливо змінити весь ланцюг, який передував йому. Спадкування дозволяє викликати, але не змінювати властивості об’єкта, це є ключовою перевагою JS, бо дозволяє вибірково переписувати спадкові властивості, не руйнуючи попередній функціонал.

Подякували: Yola, 221VOLT2

3 Востаннє редагувалося Yola (09.03.2017 16:09:55)

Re: Щоб спадкування працювало з об'єктами класу створеними до ланцюжка про

before instanceof Shape2D //повертає false
after instanceof Shape2D // повертає true

імовірно рядок

Shape2D.prototype = new Shape();

змінив тип і тепер всі попередні примірники Shape2D уже не Shape2D.

4

Re: Щоб спадкування працювало з об'єктами класу створеними до ланцюжка про

Тут https://developer.mozilla.org/en-US/doc … instanceof пишуть, що значення оператора instanceof може змінитися, через зміну прототипу нашого конструктора. Але наш примірник before все ще має в своєму ланцюгу прототипів конструктор Shape2D. Це можна перевірити в консолі.

Подякували: Yola1

5

Re: Щоб спадкування працювало з об'єктами класу створеними до ланцюжка про

Перевизначену toString, можна викликати так before.constructor.prototype.toString();

Подякували: Yola1