Работа с объектами в JavaScript

Что вернёт следующий код?

console.log(Object.create(null).hasOwnProperty('toString'))

Теория по задаче

Что такое Object.create?

Метод Object.create(proto[, descriptors]) предназначен для создания новых объектов с указанным прототипом (proto) и дополнительными параметрами (дескрипторами свойств). Важнейшее отличие заключается в возможности задать null в качестве прототипа, создавая объект, не связанный с обычной иерархией прототипов JavaScript.

Механизм прототипов в JavaScript

Каждый объект в JavaScript имеет внутреннее свойство [[Prototype]], ссылающийся на другой объект или на null. Свойства и методы объекта ищут сначала в самом объекте, а затем в его прототипе. Обычные объекты создаются с прототипом Object.prototype, благодаря чему получают общие методы и свойства, такие как hasOwnProperty(), toString() и другие.

Особенности Object.create(null)

Использование конструкции Object.create(null) приводит к созданию объекта, чей прототип равен null. Таким образом, этот объект не наследует ничего от стандартного объекта-прототипа Object.prototype. Соответственно, стандартные методы и свойства, присутствующие в обычных объектах, оказываются недоступны.

Метод hasOwnProperty()

Метод hasOwnProperty() — это специальный метод, расположенный в прототипе Object.prototype. Его задача — проверить, является ли указанное свойство собственным свойством текущего объекта, а не унаследованным от прототипа.

Стандартный вызов метода:

myObject.hasOwnProperty(propertyName);

Но важно помнить, что вызов этого метода возможен только в тех объектах, чьи прототипы содержат его определение.

Проблемы при отсутствии прототипа

Если объект создан с помощью Object.create(null), он теряет связь с прототипом, откуда берётся метод hasOwnProperty(). В результате попытка вызвать этот метод приведет к ошибке TypeError, так как указанного метода попросту нет в объекте.

Итого

Использование Object.create(null) полезно, когда необходимо исключить влияние стандартного прототипа и обеспечить полную независимость объекта от общих методов и свойств. Однако это накладывает ограничения на использование базовых инструментов, таких как hasOwnProperty(), что требует осторожности при написании кода.