Почему содержимое этих объектов не совпадает? - PullRequest
2 голосов
/ 04 августа 2020

Я просматриваю эту MDN страницу под заголовком «Мутация прототипа».

Я копирую приведенные ниже фрагменты кода в консоль своего браузера.

Почему o1:

A

o1 = {}
let __proto__ = {color: "red"};

o1 = {__proto__};

console.log(o1);

Не то же самое, что o2:

B

o2 = {}

Object.setPrototypeOf(o2, {color: "red"});

console.log(o2);

Я знаю, что A использует сокращенные имена свойств.
Является ли __proto__ прямым свойством o1?


Изменить: для просмотра одним из комментаторов:

enter image description here

введите описание изображения здесь

1 Ответ

1 голос
/ 04 августа 2020

Ссылка: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer

Определения свойств, в которых не используется запись с двоеточием, не являются мутациями прототипов. Это определения свойств, которые ведут себя идентично аналогичным определениям с любым другим именем.

let o0 = {};
console.log('o0: ' + o0.hasOwnProperty('__proto__'));
// a bare object doesnt have a property named '__proto__'

let __proto__ = {color: "red"};

let o1 = {__proto__};
// based on o0 above then, shorthand variable notation basically gets in the way of it using it 
// as accessor to the underlying prototype. Instead, the result of this is that __proto__
// becomes a property of o1 as one would expect from shorthand notation...

const newO1 = Object.create(o1);
console.log('o1: ' + o1.hasOwnProperty('__proto__'));
console.log('newO1: ' + newO1.hasOwnProperty('__proto__'));
console.log('newO1: ' + newO1.color);

let o2 = {};
Object.setPrototypeOf(o2, {color: "red"});

const newO2 = Object.create(o2);
console.log('newO2: ' + Object.keys(newO2));
console.log('newO2: ' + newO2.color);

let o3 = {__proto__: {color: 'red'}};

const newO3 = Object.create(o3);
console.log('newO3: ' + Object.keys(newO3));
console.log('newO3: ' + newO3.color);
// something about the more verbose colon notation triggers the interpreter to know that 
// you intend to mutate the prototype and so uses __proto__ as the accessor rather than
// creating __proto__ as a property

В этом фрагменте:

  • o0 демонстрирует, что голый объект не имеет proto свойства
  • o1 не использует нотацию «двоеточие».
  • o3 использует нотацию «двоеточие».
  • o2 явно использует setPrototypeOf ()
  • результаты такие же, как o3.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...