Прототип после создания
В примерах ниже создаётся объект new Rabbit
, а затем проводятся различные действия с prototype
.
Каковы будут результаты выполнения? Почему?
Начнём с этого кода. Что он выведет?
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
var rabbit = new Rabbit();
alert( rabbit.eats );
Добавили строку (выделена), что будет теперь?
function Rabbit() {}
Rabbit.prototype = {
eats: true
};
var rabbit = new Rabbit();
Rabbit.prototype = {};
alert( rabbit.eats );
А если код будет такой? (заменена одна строка):
function Rabbit(name) {}
Rabbit.prototype = {
eats: true
};
var rabbit = new Rabbit();
Rabbit.prototype.eats = false;
alert( rabbit.eats );
А такой? (заменена одна строка)
function Rabbit(name) {}
Rabbit.prototype = {
eats: true
};
var rabbit = new Rabbit();
delete rabbit.eats; // (*)
alert( rabbit.eats );
И последний вариант:
function Rabbit(name) {}
Rabbit.prototype = {
eats: true
};
var rabbit = new Rabbit();
delete Rabbit.prototype.eats; // (*)
alert( rabbit.eats );
Результат: true
, из прототипа
Результат: true
. Свойство prototype
всего лишь задаёт __proto__
у новых объектов. Так что его изменение не повлияет на rabbit.__proto__
. Свойство eats
будет получено из прототипа.
Результат: false
. Свойство Rabbit.prototype
и rabbit.__proto__
указывают на один и тот же объект. В данном случае изменения вносятся в сам объект.
Результат: true
, так как delete rabbit.eats
попытается удалить eats
из rabbit
, где его и так нет. А чтение в alert
произойдёт из прототипа.
Результат: undefined
. Удаление осуществляется из самого прототипа, поэтому свойство rabbit.eats
больше взять неоткуда.