Почему не происходят изменения объекта?
Насколько я знаю, объекты присваиваются по ссылке (!не копируются). Поэтому если изменения в объекте происходят по одной ссылке, то они происходят и по другой.
let a = {
writer: 'J.K. Rowling',
singer: 'Beyonce',
politician: 'A. Merkel'
};
let b = a;
delete a.politician;
console.log(b); //здесь также нет politicaian
Почему тогда здесь все работает немного по-другому? По тому же принципу prototype является одним объектом, поэтому изменения должны быть везде (по двум ссылкам).
let userInfo = {
name: 'Kira',
surname: 'Li',
age: 25,
country: 'USA',
city: 'LA'
};
let food = {
fruit: 'apple',
vegetable: 'cabbage',
pastry: 'bun',
drink: 'water'
};
function Constructor() {};
Constructor.prototype = userInfo;
let obj = new Constructor;
Constructor.prototype = food; //произошло переприсвоение
console.log(Object.getPrototypeOf(obj)); //все также userInfo
А вот здесь, например, изменение происходит. Почему?
let userInfo = {
name: 'Kira',
surname: 'Li',
age: 25,
country: 'USA',
city: 'LA'
};
let food = {
fruit: 'apple',
vegetable: 'cabbage',
pastry: 'bun',
drink: 'water'
};
function Constructor() {};
Constructor.prototype = userInfo;
let obj = new Constructor;
Constructor.prototype.name = 'Klara'; //произошло переприсвоение
console.log(Object.getPrototypeOf(obj));
Почему так? Почему в некоторых случаях происходит изменение объекта, а в некоторых нет?
Ответы (1 шт):
Автор решения: vsemozhebuty
→ Ссылка
На самом деле всё соответствует присвоению по ссылке.
function Constructor() {};
Constructor.prototype = userInfo;
let obj = new Constructor;
Constructor.prototype = food; //произошло переприсвоение
Можно представить как:
const obj1 = { a: { b: 1 } }; // Это наш конструктор с прототипом в "a".
const obj2 = { c: obj1.a }; // Это создание экземпляра с ссылкой на прототип.
// obj2.c присвоено значение obj1.a,
// но по сути присвоена ссылка на { b: 1 }
// obj2.c больше не связано с obj1.a, но связано с { b: 1 }
obj1.a = { d: 2 };
// obj1.a теперь ссылается на { d: 2 }
// но obj2.c по-прежнему ссылается на { b: 1 }
console.log(obj2.c); // { b: 1 }