Показать сообщение отдельно
  #12 (permalink)  
Старый 07.01.2021, 20:58
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,743

На самом деле все немного сложнее.
У объектов нет никакого свойства __proto__. Есть внутреннее, недоступное из программ свойство [[Prototype]]. А __proto__ это getter/setter из Object.prototype - системные функции JS, которые могут получать/менять [[Prototype]] объектов. Они доступны из объектов через цепочку прототипов. Если она не нарушена.
let op = {
	x: 1,
	y: 2
};

let o ={};
o.__proto__ = op;

console.log (o.__proto__); // {x:1, y:2} здесь идет обращение к Object.prototype get __proto__
console.log (o.x, o.y); // 1 2   это из прототипа

o.__proto__ = null;

console.log (o.x, o.y); // undefined undefined  т.к. нет прототипа

o.__proto__ = op;

console.log (o.__proto__) // по прежнему {x:1, y:2} но это не прототип! это обычное свойство __proto__
console.log (o.x, o.y); // и по прежнему undefined undefined т.к. нет прототипа. И никогда не будет.


Написав o.__proto__ = null, мы нарушили цепочку прототипов. Из нашего объекта теперь невозможно добраться до Object.prototype и нет доступа к setter __proto__. Поэтому, когда мы снова пишем o.__proto__ = op, то не меняем прототип [[Prototype]], а просто создаем обычное свойство с именем __proto__. Оно ссылается на op, но это не имеет никакого отношения к прототипу объекта

Последний раз редактировалось voraa, 07.01.2021 в 21:11.
Ответить с цитированием