Object.getPrototypeOf() возвращает прототип объекта.
Это один из базовых методов для работы с прототипным наследованием в JavaScript.
Синтаксис
Object.getPrototypeOf(obj)
obj - объект, у которого нужно получить прототип.
Что делает Object.getPrototypeOf()
Метод берёт объект и возвращает его прототип.
const user = {};
console.log(Object.getPrototypeOf(user) === Object.prototype); // true
Для обычного объекта литерал {} обычно имеет прототип Object.prototype.
Что возвращает метод
Object.getPrototypeOf() возвращает:
- объект-прототип, если он есть
null, если у объекта нет прототипа
const user = {};
console.log(Object.getPrototypeOf(user)); // Object.prototype
Пример с Object.create()
Через Object.create() особенно хорошо видно, как это работает.
const animal = {
speak() {
console.log("sound");
},
};
const dog = Object.create(animal);
console.log(Object.getPrototypeOf(dog) === animal); // true
Здесь прототипом dog является animal.
Объект без прототипа
Если объект создан через Object.create(null), у него нет прототипа.
const dict = Object.create(null);
console.log(Object.getPrototypeOf(dict)); // null
Это важный частный случай.
Object.getPrototypeOf() и isPrototypeOf()
Эти методы похожи, но отвечают на разные вопросы.
const animal = {};
const dog = Object.create(animal);
console.log(Object.getPrototypeOf(dog) === animal); // true
console.log(animal.isPrototypeOf(dog)); // true
Object.getPrototypeOf() возвращает сам прототип.
isPrototypeOf() только проверяет, есть ли объект в цепочке прототипов.
Object.getPrototypeOf() и instanceof
instanceof обычно используют с конструктором или классом.
Object.getPrototypeOf() работает напрямую с объектом.
function User() {}
const user = new User();
console.log(user instanceof User); // true
console.log(Object.getPrototypeOf(user) === User.prototype); // true
То есть instanceof делает проверку, а Object.getPrototypeOf() возвращает конкретный объект-прототип.
Object.getPrototypeOf() и proto
Иногда прототип смотрят через __proto__:
const user = {};
console.log(user.__proto__ === Object.prototype); // true
Но в обычном коде чаще рекомендуют использовать именно Object.getPrototypeOf(), потому что это стандартный и более явный способ.
Прототип массива
Массив тоже является объектом, поэтому метод работает и с ним.
const arr = [1, 2, 3];
console.log(Object.getPrototypeOf(arr) === Array.prototype); // true
А выше в цепочке у массива уже будет Object.prototype.
Прототип функции
С функциями метод тоже работает.
function greet() {}
console.log(Object.getPrototypeOf(greet) === Function.prototype); // true
Это полезно, если вы разбираетесь в устройстве встроенных типов JavaScript.
Примитивы
Если передать примитив, JavaScript сначала обернёт его в объект.
console.log(Object.getPrototypeOf("hi") === String.prototype); // true
console.log(Object.getPrototypeOf(123) === Number.prototype); // true
console.log(Object.getPrototypeOf(true) === Boolean.prototype); // true
А вот null и undefined вызовут ошибку:
Object.getPrototypeOf(null); // TypeError
Object.getPrototypeOf(undefined); // TypeError
Object.getPrototypeOf() не меняет объект
Метод только читает информацию и ничего не изменяет.
const user = {};
const proto = Object.getPrototypeOf(user);
console.log(user); // {}
console.log(proto === Object.prototype); // true
Когда это полезно
Object.getPrototypeOf() удобно использовать, когда:
- нужно понять, от чего наследуется объект
- вы разбираете чужой код с прототипами
- нужно проверить прямой прототип объекта
- вы работаете с
Object.create()или классами
Пример:
const base = { role: "user" };
const person = Object.create(base);
console.log(Object.getPrototypeOf(person) === base); // true
Частые ошибки
Путать прямой прототип и всю цепочку
const a = {};
const b = Object.create(a);
const c = Object.create(b);
console.log(Object.getPrototypeOf(c) === b); // true
console.log(Object.getPrototypeOf(c) === a); // false
Метод возвращает только прямой прототип, а не всю цепочку сразу.
Думать, что метод проверяет наследование как instanceof
function User() {}
const user = new User();
console.log(Object.getPrototypeOf(user) === User.prototype); // true
Здесь метод не отвечает “да или нет” про всю цепочку, а просто возвращает один конкретный прототип.
Вызывать метод на null или undefined
Object.getPrototypeOf(null); // TypeError
Для этих значений метод не работает.
Быстрая памятка
Object.getPrototypeOf()возвращает прямой прототип объекта- если прототипа нет, результатом будет
null - метод не меняет объект
isPrototypeOf()проверяет цепочку, аObject.getPrototypeOf()возвращает сам прототип__proto__обычно заменяют наObject.getPrototypeOf()
Коротко
Object.getPrototypeOf() - это стандартный способ узнать, от чего наследуется объект в JavaScript. Главное, что стоит запомнить: метод возвращает именно прямой прототип объекта, а не просто булев ответ о наследовании.