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