Методы прототипов, объекты без свойства proto
Свойство __proto__ считается устаревшим, и по стандарту оно должно поддерживаться только браузерами.
Современные же методы это:
Object.create(proto[, descriptors])– создаёт пустой объект со свойством [[Prototype]], указанным как proto, и необязательными дескрипторами свойствdescriptors.Object.getPrototypeOf(obj)– возвращает свойство[[Prototype]]объектаobj.Object.setPrototypeOf(obj, proto)– устанавливает свойство[[Prototype]]объектаobjкакproto.
Эти методы нужно использовать вместо __proto__.
Встроенный геттер/сеттер __proto__ не безопасен, если мы хотим использовать созданные пользователями ключи в объекте. Как минимум потому, что пользователь может ввести "proto" как ключ, от чего может возникнуть ошибка. Если повезёт – последствия будут лёгкими, но, вообще говоря, они непредсказуемы.
Так что мы можем использовать либо Object.create(null) для создания «простейшего» объекта, либо использовать коллекцию Map.
Кроме этого, Object.create даёт нам лёгкий способ создать поверхностную копию объекта со всеми дескрипторами:
__proto__ – это геттер/сеттер для свойства [[Prototype]], и находится он в Object.prototype, как и другие методы.
Ещё методы:
Object.keys(obj)/Object.values(obj)/Object.entries(obj)– возвращают массив всех перечисляемых собственных строковых ключей/значений/пар ключ-значение.Object.getOwnPropertySymbols(obj)– возвращает массив всех собственных символьных ключей.Object.getOwnPropertyNames(obj)– возвращает массив всех собственных строковых ключей.Reflect.ownKeys(obj)– возвращает массив всех собственных ключей.obj.hasOwnProperty(key): возвращаетtrue, если уobjесть собственное (не унаследованное) свойство с именемkey.
Все методы, которые возвращают свойства объектов (такие как Object.keys и другие), возвращают «собственные» свойства. Если мы хотим получить и унаследованные, можно воспользоваться циклом for..in.
🚀 Источник: https://learn.javascript.ru/prototype-methods