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″>
typeof{}.toStringSymbol.toStringTag instanceofAs 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