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 Array
hereda 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 toString
se 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.call
en lugar de instanceof
para objetos incorporados cuando queremos obtener el tipo como una cadena en lugar de solo comprobar.,4012″>
typeof
{}.toString
Symbol.toStringTag
instanceof
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.
Deja una respuesta