Spec-Zone.ru › JavaScript

Object.prototype.isPrototypeOf()

Базовая поддержка Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в различных версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

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

Примечание: isPrototypeOf() отличается от оператора instanceof. В выражении object instanceof AFunction цепочка прототипов object проверяется относительно AFunction.prototype, а не относительно самого AFunction.

Попробовать

function Foo() {}
function Bar() {}

Bar.prototype = Object.create(Foo.prototype);

const bar = new Bar();

console.log(Foo.prototype.isPrototypeOf(bar));
// Expected output: true
console.log(Bar.prototype.isPrototypeOf(bar));
// Expected output: true

Синтаксис

isPrototypeOf(object)

Параметры

object
Объект, чья цепочка прототипов будет исследована.

Возвращаемое значение

Булево значение, указывающее, находится ли вызывающий объект (this) в цепочке прототипов object. Непосредственно возвращает false, если object не является объектом (т. е. примитивом).

Исключения

TypeError
Выбрасывается, если this является null или undefined (поскольку он не может быть преобразован в объект).

Описание

Все объекты, которые наследуются от Object.prototype (то есть все, кроме объектов с null-прототипом), наследуют метод isPrototypeOf(). Этот метод позволяет проверить, существует ли данный объект в цепочке прототипов другого объекта. Если object, переданный в качестве параметра, не является объектом (т. е. примитивом), метод непосредственно возвращает false. В противном случае значение this преобразуется в объект, и цепочка прототипов object ищет значение this, пока не будет достигнут конец цепочки или не будет найдено значение this.

Примеры

Использование isPrototypeOf()

Этот пример демонстрирует, что Baz.prototype, Bar.prototype, Foo.prototype и Object.prototype существуют в цепочке прототипов для объекта baz:

class Foo {}
class Bar extends Foo {}
class Baz extends Bar {}

const foo = new Foo();
const bar = new Bar();
const baz = new Baz();

// prototype chains:
// foo: Foo --> Object
// bar: Bar --> Foo --> Object
// baz: Baz --> Bar --> Foo --> Object
console.log(Baz.prototype.isPrototypeOf(baz)); // true
console.log(Baz.prototype.isPrototypeOf(bar)); // false
console.log(Baz.prototype.isPrototypeOf(foo)); // false
console.log(Bar.prototype.isPrototypeOf(baz)); // true
console.log(Bar.prototype.isPrototypeOf(foo)); // false
console.log(Foo.prototype.isPrototypeOf(baz)); // true
console.log(Foo.prototype.isPrototypeOf(bar)); // true
console.log(Object.prototype.isPrototypeOf(baz)); // true

Метод isPrototypeOf() — наряду с оператором instanceof — оказывается особенно полезным, если у вас есть код, который может функционировать только при работе с объектами, произошедшими от определённой цепочки прототипов; например, чтобы гарантировать, что определённые методы или свойства будут присутствовать в этом объекте.

Например, чтобы выполнить некоторый код, который безопасно запускать, только если объект baz имеет Foo.prototype в своей цепочке прототипов, вы можете сделать следующее:

if (Foo.prototype.isPrototypeOf(baz)) {
  // do something safe
}

Однако существование Foo.prototype в цепочке прототипов baz не означает, что baz был создан с использованием Foo в качестве конструктора. Например, baz может быть напрямую присвоен с Foo.prototype в качестве своего прототипа. В этом случае, если ваш код считывает приватные поля Foo из baz, он всё равно завершится ошибкой:

class Foo {
  #value = "foo";
  static getValue(x) {
    return x.#value;
  }
}

const baz = { __proto__: Foo.prototype };

if (Foo.prototype.isPrototypeOf(baz)) {
  console.log(Foo.getValue(baz)); // TypeError: Cannot read private member #value from an object whose class did not declare it
}

То же самое относится к instanceof. Если вам нужно безопасно считывать приватные поля, предложите фирменный метод проверки с использованием in вместо этого.

class Foo {
  #value = "foo";
  static getValue(x) {
    return x.#value;
  }
  static isFoo(x) {
    return #value in x;
  }
}

const baz = { __proto__: Foo.prototype };

if (Foo.isFoo(baz)) {
  // Doesn't run, because baz is not a Foo
  console.log(Foo.getValue(baz));
}

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-object.prototype.isprototypeof

Совместимость с браузерами

Десктопные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
isPrototypeOf
1
12
1
4
3
18
4
10.1
1
1.0
1
1
1.0.0
1.0
0.10.0

Смотрите также

  • instanceof
  • Object.getPrototypeOf()
  • Object.setPrototypeOf()
  • Наследование и цепочка прототипов

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isPrototypeOf

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API