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));
}
Спецификации
Совместимость с браузерами
| Десктопные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 |
Смотрите также
© 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