Learn JavaScript

Object.getPrototypeOf() - метод для получения прототипа объекта в JavaScript

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. Главное, что стоит запомнить: метод возвращает именно прямой прототип объекта, а не просто булев ответ о наследовании.