Function.prototype[Symbol.hasInstance]()
Базовый уровень Широко доступно
Эта возможность хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Метод [Symbol.hasInstance]() экземпляров Function определяет процедуру по умолчанию для определения того, распознаёт ли функция-конструктор объект как один из экземпляров конструктора. Он вызывается оператором instanceof.
Синтаксис
func[Symbol.hasInstance](value)
Параметры
-
value - Объект для проверки. Примитивные значения всегда возвращают
false.
Возвращаемое значение
true, если func.prototype находится в цепочке прототипов value; в противном случае — false. Всегда возвращает false, если value не является объектом или this не является функцией. Если this является связанной функцией, возвращает результат проверки instanceof для value и нижележащей целевой функции.
Исключения
-
TypeError - Выбрасывается, если
thisне является связанной функцией иthis.prototypeне является объектом.
Описание
Оператор instanceof вызывает метод [Symbol.hasInstance]() правой части, если такой метод существует. Поскольку все функции наследуются от Function.prototype по умолчанию, у них у всех будет метод [Symbol.hasInstance](), поэтому в большинстве случаев метод Function.prototype[Symbol.hasInstance]() определяет поведение instanceof, когда правая часть является функцией. Этот метод реализует поведение оператора instanceof по умолчанию (тот же алгоритм, когда у constructor нет метода [Symbol.hasInstance]()).
В отличие от большинства методов, свойство Function.prototype[Symbol.hasInstance]() не является конфигурируемым и не является записываемым. Это функция безопасности, предотвращающая получение нижележащей целевой функции связанной функции. См. этот ответ Stack Overflow для примера.
Примеры
Возврат к поведению instanceof по умолчанию
Вам редко потребуется вызывать этот метод напрямую. Вместо этого, этот метод вызывается оператором instanceof. Вы должны ожидать, что эти два результата обычно будут эквивалентны.
class Foo {}
const foo = new Foo();
console.log(foo instanceof Foo === Foo[Symbol.hasInstance](foo)); // true
Вы можете захотеть использовать этот метод, если хотите вызвать поведение instanceof по умолчанию, но не знаете, имеет ли конструктор переопределенный метод [Symbol.hasInstance]().
class Foo {
static [Symbol.hasInstance](value) {
// A custom implementation
return false;
}
}
const foo = new Foo();
console.log(foo instanceof Foo); // false
console.log(Function.prototype[Symbol.hasInstance].call(Foo, foo)); // true
Спецификации
Совместимость с браузерами
| Десктопные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 | |
@@hasInstance |
50 |
15 |
50 |
37 |
10 |
50 |
50 |
37 |
10 |
5.0 |
50 |
10 |
1.0.0 |
1.0 |
6.5.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/Function/Symbol.hasInstance