Работа с объектами в 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(), что требует осторожности при написании кода.