Если я введу это в консоль:

var x = {a: 1};
var y = Object.create(x);
console.log(y);

Он показывает {}. Но если я запустил его в fiddle, он покажет {a: 1}, что является ожидаемым результатом. Также здесь:

var x = {a: 1};
var y = Object.create(x);
console.log(y);

Так, что происходит?

1
ariel 9 Июн 2021 в 00:44

2 ответа

Лучший ответ

Работает, как ожидалось, даже в консоли. Вам просто нужно расширить объект.

enter image description here

2
Fresnel 8 Июн 2021 в 21:48

Ответ

Почему Object.create не создает клонированные свойства, как ожидалось?

Потому что Object.create не должен клонировать свойства.

Объекты JavaScript сложны

Если мы посмотрим на документацию {{X0 }}, говорится:

Метод Object.create () создает новый объект, используя существующий объект в качестве прототипа вновь созданного объекта.

Помимо собственных свойств, каждый объект в JavaScript также наследует свойства своего прототипа.

Теперь сложная часть - унаследованные свойства видны только в некоторых случаях. Например:

  • Аксессор свойства - y.a или y['a'] - ✅ видит унаследованные свойства
    • console.log(y.a); // outputs 1
  • Object.keys, Object.values, Object.entries - ❌ не видит унаследованные свойства
    • console.log(Object.keys(y)); // outputs []

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

Для более подробного объяснения прототипов см. прототипы объектов .

Почему JSFiddle печатает иначе, чем Chrome?

Очевидно, реализация console в JSFiddle перечисляет унаследованные свойства, тогда как реализация console в Chrome - нет.

2
rsmeral 8 Июн 2021 в 22:45