This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2017.
The Symbol.hasInstance static data property represents the well-known symbol Symbol.hasInstance. The instanceof operator looks up this symbol on its right-hand operand for the method used to determine if the constructor object recognizes an object as its instance.
class Array1 {
static [Symbol.hasInstance](instance) {
return Array.isArray(instance);
}
}
console.log([] instanceof Array1);
// Expected output: true
The well-known symbol Symbol.hasInstance.
Property attributes of Symbol.hasInstance
| |
|---|---|
| Writable | no |
| Enumerable | no |
| Configurable | no |
The instanceof operator uses the following algorithm to calculate the return value of object instanceof constructor:
constructor has a [Symbol.hasInstance]() method, then call it with object as the first argument and return the result, coerced to a boolean. Throw a TypeError if constructor is not an object, or if constructor[Symbol.hasInstance] is not one of null, undefined, or a function.constructor doesn't have a [Symbol.hasInstance]() method (constructor[Symbol.hasInstance] is null or undefined), then determine the result using the same algorithm as Function.prototype[Symbol.hasInstance](). Throw a TypeError if constructor is not a function.Because all functions inherit from Function.prototype by default, most of the time, the Function.prototype[Symbol.hasInstance]() method specifies the behavior of instanceof when the right-hand side is a function.
You could implement your custom instanceof behavior like this, for example:
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
Just in the same manner at which you can check if an object is an instance of a class using the instanceof keyword, we can also use Symbol.hasInstance for such checks.
class Animal {
constructor() {}
}
const cat = new Animal();
console.log(Animal[Symbol.hasInstance](cat)); // true
| Desktop | Mobile | Server | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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/Symbol/hasInstance