o instanceof
operador permite verificar se um objecto pertence a uma determinada classe. Também tem em conta a herança.este controlo pode ser necessário em muitos casos. Por exemplo, ele pode ser usado para construir uma função polimórfica, aquela que trata argumentos de forma diferente dependendo de seu tipo.,
O operador instanceof
A sintaxe é:
obj instanceof Class
retorna true
se obj
pertence ao Class
ou de uma classe herdam-lo.,
Por exemplo:
class Rabbit {}let rabbit = new Rabbit();// is it an object of Rabbit class?alert( rabbit instanceof Rabbit ); // true
Ele também funciona com as funções do construtor:
// instead of classfunction Rabbit() {}alert( new Rabbit() instanceof Rabbit ); // true
…E com built-in de classes, como Array
:
let arr = ;alert( arr instanceof Array ); // truealert( arr instanceof Object ); // true
por Favor, note que arr
também pertence ao Object
classe., Isso porque Array
prototipicamente herda de Object
.
normalmente, instanceof
examina a cadeia protótipo para a verificação. Também podemos definir uma lógica personalizada no método estático Symbol.hasInstance
.,
O algoritmo de obj instanceof Class
funciona mais ou menos o seguinte:
Aqui está a ilustração do que rabbit instanceof Animal
compara com Animal.prototype
:
a propósito, há também um método objA.isPrototypeOf(objB), que retorna true
se objA
está em algum lugar na cadeia de protótipos para objB
., Assim, o ensaio de obj instanceof Class
pode ser reformulado como Class.prototype.isPrototypeOf(obj)
.
é engraçado, mas o Class
construtor em si não participa no cheque! Apenas a cadeia de protótipos e Class.prototype
importa.
Que pode levar a consequências interessantes quando uma propriedade
é alterada após o objeto ser criado.
Como aqui:
bónus: objecto.prototipo.,toString para o tipo
Nós já sabemos que a simples objetos são convertidos para a seqüência de caracteres como :
let obj = {};alert(obj); // alert(obj.toString()); // the same
esse é o seu implementação de toString
. Mas há uma característica escondida que faz toString
na verdade muito mais poderoso do que isso. Nós podemos usá-lo como um extended typeof
e uma alternativa para instanceof
.parece estranho? Realmente. Vamos desmistificar.,
Por especificação, o built-in toString
pode ser extraído do objeto e executado no contexto de qualquer outro valor. E o seu resultado depende desse valor.
Let’s demonstrate:
Here we used call as described in the chapter Decorators and forwarding, call/apply to execute the function objectToString
in the context this=arr
.
internamente, o algoritmo toString
examina this
e devolve o resultado correspondente. Mais exemplos:
símbolo.,toStringTag
the behavior of Object toString
can be customized using a special object property Symbol.toStringTag
.
Por exemplo:
let user = { : "User"};alert( {}.toString.call(user) ); //
Para mais ambiente-objetos específicos, não há como uma propriedade. Aqui estão alguns exemplos específicos:
Como você pode ver, o resultado é exatamente o Symbol.toStringTag
(se houver), encapsulados em .,
no final temos “typeof on steroids” que não só funciona para tipos de dados primitivos, mas também para objetos embutidos e até mesmo pode ser personalizado.
Podemos usar {}.toString.call
em vez deinstanceof
para objetos incorporados quando queremos obter o tipo como uma string em vez de apenas verificar.,4012″>
typeof
{}.toString
Symbol.toStringTag
instanceof
As we can see, {}.toString
is technically a “more advanced” typeof
.,
Einstanceof
operador realmente brilha quando estamos trabalhando com uma hierarquia de classe e quer verificar para a classe tendo em conta a herança.
Deixe uma resposta