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.callem vez deinstanceof para objetos incorporados quando queremos obter o tipo como uma string em vez de apenas verificar.,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.,

Einstanceof operador realmente brilha quando estamos trabalhando com uma hierarquia de classe e quer verificar para a classe tendo em conta a herança.