Symbol.hasInstance
Базовая поддержка Широко доступна
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с сентября 2015 года.
Статическое свойство данных Symbol.hasInstance представляет собой общеизвестный символ Symbol.hasInstance. Оператор instanceof ищет этот символ в своем правом операнде для метода, используемого для определения того, распознает ли конструктор объект как свой экземпляр.
Попробуйте
class Array1 {
static [Symbol.hasInstance](instance) {
return Array.isArray(instance);
}
}
console.log([] instanceof Array1);
// Expected output: true
Значение
Общеизвестный символ Symbol.hasInstance.
Атрибуты свойства Symbol.hasInstance
| |
|---|---|
| Записываемый | нет |
| Перечисляемый | нет |
| Настраиваемый | нет |
Описание
Оператор instanceof использует следующий алгоритм для вычисления возвращаемого значения object instanceof constructor:
- Если у
constructorесть метод[Symbol.hasInstance](), то вызовите его сobjectв качестве первого аргумента и верните результат, приведенный к булеву типу. ВыбросьтеTypeError, еслиconstructorне является объектом, или еслиconstructor[Symbol.hasInstance]не является одним изnull,undefinedили функцией. - В противном случае, если у
constructorнет метода[Symbol.hasInstance]()(constructor[Symbol.hasInstance]равенnullилиundefined), то определите результат, используя тот же алгоритм, что и дляFunction.prototype[Symbol.hasInstance](). ВыбросьтеTypeError, еслиconstructorне является функцией.
Поскольку все функции по умолчанию наследуются от Function.prototype, в большинстве случаев метод Function.prototype[Symbol.hasInstance]() определяет поведение instanceof, когда правая часть является функцией.
Примеры
Пользовательское поведение instanceof
Вы можете реализовать свое пользовательское поведение instanceof следующим образом, например:
class MyArray {
static [Symbol.hasInstance](instance) {
return Array.isArray(instance);
}
}
console.log([] instanceof MyArray); // true
function MyArray() {}
Object.defineProperty(MyArray, Symbol.hasInstance, {
value(instance) {
return Array.isArray(instance);
},
});
console.log([] instanceof MyArray); // true
Проверка экземпляра объекта
Точно так же, как вы можете проверить, является ли объект экземпляром класса, используя ключевое слово instanceof, мы также можем использовать Symbol.hasInstance для таких проверок.
class Animal {
constructor() {}
}
const cat = new Animal();
console.log(Animal[Symbol.hasInstance](cat)); // true
Спецификации
Совместимость с браузерами
| Настольные компьютеры | Мобильные устройства | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | WebView на 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 |
См. также
instanceofFunction.prototype[Symbol.hasInstance]()
© 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/Symbol/hasInstance