GeezerVison is showing uk.javascript.info — Заміна властивості "prototype"
назад до урокуЗаміна властивості "prototype"
важливість: 5
В коді, що показаний нижче, ми створюємо функцію-конструктор new Rabbit і потім змінюємо її prototype.
На початку, маємо цей код:
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
alert( rabbit.eats ); // true
-
Ми додали ще рядок коду (виділений). Що покаже тепер alert?
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
Rabbit.prototype = {};
alert( rabbit.eats ); // ?
-
…А якщо маємо такий код (з видаленим рядком коду)?
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
Rabbit.prototype.eats = false;
alert( rabbit.eats ); // ?
-
А якщо так (також з видаленим рядком коду)?
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
delete rabbit.eats;
alert( rabbit.eats ); // ?
-
І останній варіант:
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
let rabbit = new Rabbit();
delete Rabbit.prototype.eats;
alert( rabbit.eats ); // ?
Відповідь:
-
true.
Перепризначення Rabbit.prototype встановлює властивість [[Prototype]] для об’єктів, які будуть створені після цього. Але воно жодним чином не впливає на вже існуючі об’єкти.
-
false.
Об’єкти призначаються шляхом посилання на них. Об’єкт з властивості Rabbit.prototype не дублювався. Це той самий об’єкт на який посилаються як через Rabbit.prototype, так і через властивість [[Prototype]] об’єкта rabbit.
А отже, коли ми змінюємо вміст такого об’єкта через посилання, такі зміни стають видимі і через інші посилання.
-
true.
Усі delete операції застосовуються лише безпосередньо до самого об’єкта. Тут delete rabbit.eats намагається видалити властивість eats з об’єкта rabbit, але такої властивості немає. А тому така операція не має ніякого ефекту.
-
undefined.
Властивість eats видалена з прототипу, вона більше не існує.