all-threads-bot

Frontender`s Spectre

JavaScript | Практика #189 | ★★★★☆ | Proto

24 октября 2024 г., 13:11

<p><strong>Ответ: <code>12</code>.</strong></p> <p dir="auto">Сначала у нас есть пустой объект <code>x</code>, затем мы добавляем другое свойство <code>hi</code> для x с помощью <code>x.__proto__.hi</code>. Обратите внимание, что это эквивалентно <code>Object.prototype.hi = 10</code> и мы добавляем к <code>father</code> объекту <code>Object</code> свойство <code>hi</code>. Это означает, что каждый отдельный объект унаследует это свойство. Свойство <code>hi</code> становится общим. Допустим, теперь мы объявляем новый объект, такой как <code>let y = {}</code>, <code>y</code> теперь имеет свойство, <code>hi</code> унаследованное от <code>father</code> <code>Object</code>. Проще говоря, <code>x.__proto__ === Object.prototype</code> возвращает <code>true</code>.</p> <p dir="auto">Затем мы перезаписываем свойство <code>hi</code> новым значением 11. В итоге мы получаем 11 + 1 = 12. <code>x</code> имеет одно свойство, и <code>x.hi</code> возвращает 11.</p> <p dir="auto">Если вы напишете <code>Object.prototype.hi = 11;</code> вместо <code>Object.prototype.hi = ++x.hi;</code> так, как написано в приведенном выше коде, то <code>Object.keys(x)</code> вернет пустой массив, так как <code>Object.keys(object)</code> возвращает только свойства самого объекта, а не унаследованные. Это означает, что конечный результат будет равен 11, а не 12. По какой-то причине код <code>Object.prototype.hi = ++x.hi;</code> создаст свойство для объекта <code>x</code>` сам по себе, а затем `Object.keys(x)` дает нам массив `["hi"]`.</p> <p dir="auto">Однако, если вы запустите <code>console.log(x.hasOwnProperty("hi"))</code> он всё равно вернёт <code>false</code>. Кстати, если вы намеренно добавите свойство для x, например <code>x.test = "testing"</code>, то <code>console.log(x.hasOwnProperty("test"))</code> вернёт <code>true</code>.</p>

<p><strong>Ответ: <code>12</code>.</strong></p> <p dir="auto">Сначала у нас есть пустой объект <code>x</code>, затем мы добавляем другое свойство <code>hi</code> для x с помощью <code>x.__proto__.hi</code>. Обратите внимание, что это эквивалентно <code>Object.prototype.hi = 10</code> и мы добавляем к <code>father</code> объекту <code>Object</code> свойство <code>hi</code>. Это означает, что каждый отдельный объект унаследует это свойство. Свойство <code>hi</code> становится общим. Допустим, теперь мы объявляем новый объект, такой как <code>let y = {}</code>, <code>y</code> теперь имеет свойство, <code>hi</code> унаследованное от <code>father</code> <code>Object</code>. Проще говоря, <code>x.__proto__ === Object.prototype</code> возвращает <code>true</code>.</p> <p dir="auto">Затем мы перезаписываем свойство <code>hi</code> новым значением 11. В итоге мы получаем 11 + 1 = 12. <code>x</code> имеет одно свойство, и <code>x.hi</code> возвращает 11.</p> <p dir="auto">Если вы напишете <code>Object.prototype.hi = 11;</code> вместо <code>Object.prototype.hi = ++x.hi;</code> так, как написано в приведенном выше коде, то <code>Object.keys(x)</code> вернет пустой массив, так как <code>Object.keys(object)</code> возвращает только свойства самого объекта, а не унаследованные. Это означает, что конечный результат будет равен 11, а не 12. По какой-то причине код <code>Object.prototype.hi = ++x.hi;</code> создаст свойство для объекта <code>x</code>` сам по себе, а затем `Object.keys(x)` дает нам массив `["hi"]`.</p> <p dir="auto">Однако, если вы запустите <code>console.log(x.hasOwnProperty("hi"))</code> он всё равно вернёт <code>false</code>. Кстати, если вы намеренно добавите свойство для x, например <code>x.test = "testing"</code>, то <code>console.log(x.hasOwnProperty("test"))</code> вернёт <code>true</code>.</p>
Ниже представлено пояснение.

Ответ: 12.

Сначала у нас есть пустой объект x, затем мы добавляем другое свойство hi для x с помощью x.__proto__.hi. Обратите внимание, что это эквивалентно Object.prototype.hi = 10 и мы добавляем к father объекту Object свойство hi. Это означает, что каждый отдельный объект унаследует это свойство. Свойство hi становится общим. Допустим, теперь мы объявляем новый объект, такой как let y = {}, y теперь имеет свойство, hi унаследованное от father Object. Проще говоря, x.__proto__ === Object.prototype возвращает true.

Затем мы перезаписываем свойство hi новым значением 11. В итоге мы получаем 11 + 1 = 12. x имеет одно свойство, и x.hi возвращает 11.

Если вы напишете Object.prototype.hi = 11; вместо Object.prototype.hi = ++x.hi; так, как написано в приведенном выше коде, то Object.keys(x) вернет пустой массив, так как Object.keys(object) возвращает только свойства самого объекта, а не унаследованные. Это означает, что конечный результат будет равен 11, а не 12. По какой-то причине код Object.prototype.hi = ++x.hi; создаст свойство для объекта x` сам по себе, а затем `Object.keys(x)` дает нам массив `["hi"]`.

Однако, если вы запустите console.log(x.hasOwnProperty("hi")) он всё равно вернёт false. Кстати, если вы намеренно добавите свойство для x, например x.test = "testing", то console.log(x.hasOwnProperty("test")) вернёт true.