el operador instanceof permite comprobar si un objeto pertenece a una clase determinada. También tiene en cuenta la herencia.

Este control puede ser necesario en muchos casos. Por ejemplo, se puede usar para construir una función polimórfica, la que trata los argumentos de manera diferente dependiendo de su tipo.,

El operador instanceof

La sintaxis es:

obj instanceof Class

devuelve true si obj pertenece a la Class o una clase que herede de ella.,

Por ejemplo:

class Rabbit {}let rabbit = new Rabbit();// is it an object of Rabbit class?alert( rabbit instanceof Rabbit ); // true

también funciona con las funciones de constructor:

// instead of classfunction Rabbit() {}alert( new Rabbit() instanceof Rabbit ); // true

…Y con construido-en las clases como Array:

let arr = ;alert( arr instanceof Array ); // truealert( arr instanceof Object ); // true

por Favor, tenga en cuenta que arr también pertenece a la Object clase., Esto se debe a que Arrayhereda prototípicamente de Object.

normalmente,instanceof examina la cadena del prototipo para la comprobación. También podemos establecer una lógica personalizada en el método estático Symbol.hasInstance.,

El algoritmo de obj instanceof Class funciona más o menos como sigue:

Aquí está la ilustración de lo rabbit instanceof Animal compara con la etiqueta Animal.prototype:

Por cierto, también hay un método objA.isPrototypeOf (objB), que devuelve true si objA está en algún lugar de la cadena de prototipos para objB., Por lo tanto, la prueba de obj instanceof Class se puede reformular como Class.prototype.isPrototypeOf(obj).

es divertido, pero el constructor Class no participa en la comprobación! Solo importa la cadena de prototipos y Class.prototype.

que puede llevar a consecuencias interesantes cuando una propiedad prototype se cambia después de que se crea el objeto.

Como aquí:

Bonus: Objeto.prototipo.,toString para el tipo de

ya sabemos que la llanura objetos se convierten en cadena como :

let obj = {};alert(obj); // alert(obj.toString()); // the same

Esa es su aplicación de toString. Pero hay una característica oculta que hace que toString en realidad sea mucho más potente que eso. Lo podemos usar como una extensión typeof y una alternativa para instanceof.

Suena extraño? Efectivamente. Vamos a desmitificar.,

Por Especificación, El toString puede extraerse del objeto y ejecutarse en el contexto de cualquier otro valor. Y su resultado depende de ese valor.

vamos a demostrar:

Aquí usamos call como se describe en el capítulo decoradores y reenvío, call/apply para ejecutar la función objectToString en el contexto this=arr.

Internamente, el toString algoritmo examina this y devuelve el resultado correspondiente. Más ejemplos:

Símbolo.,toStringTag

El comportamiento de Object toStringse puede personalizar utilizando una propiedad de objeto especial Symbol.toStringTag.

Por ejemplo:

let user = { : "User"};alert( {}.toString.call(user) ); // 

Para la mayoría de los entornos específicos de los objetos, se trata de una propiedad. Estos son algunos ejemplos específicos del navegador:

como puede ver, el resultado es exactamente Symbol.toStringTag (si existe), envuelto en .,

al final tenemos «typeof on steroids» que no solo funciona para tipos de datos primitivos, sino también para objetos incorporados e incluso se puede personalizar.

Podemos usar {}.toString.callen lugar de instanceof para objetos incorporados cuando queremos obtener el tipo como una cadena en lugar de solo comprobar.,4012″>

works for returns typeof primitives string {}.toString primitives, built-in objects, objects with Symbol.toStringTag string instanceof objects true/false

As we can see, {}.toString is technically a «more advanced” typeof.,

Yinstanceof el operador realmente brilla cuando estamos trabajando con una jerarquía de clases y queremos verificar la clase teniendo en cuenta la herencia.