Заміна властивості "prototype"
В коді, що показаний нижче, ми створюємо об’єкт new Rabbit
і потім міняємо його прототип.
На початку, маємо цей код:
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
видалена з прототипу, вона більше не існує.