Изменяем "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удалено из прототипа, оно больше не существует.