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