Sabemos que o operador instanceof é usado para verificar se um objeto é uma instância de um construtor. Os vários cenários em que retorna verdadeiro estão listados abaixo.
1. O objeto obj é criado por meio do novo Construtor, então obj instanceof Construtor é verdadeiro
Copie o código do código da seguinte forma:
função Pessoa(n, a) {
este.nome = n;
esta.idade = a;
}
var p = nova Pessoa('John Backus', 82);
console.log(p instância de Pessoa);
2. Se houver um relacionamento de herança, a instância da subclasse e a classe pai também retornarão verdadeiro.
Copie o código do código da seguinte forma:
função A(){}
função B(){}
B.prototype = new A(); // B herda de A
var b = novo B();
console.log(b instância de A);
3. Como Object é a classe raiz, todas as outras classes personalizadas herdam dela, então a instância de Object de qualquer construtor retorna verdadeiro.
Copie o código do código da seguinte forma:
função A() {}
var a = new A();
console.log(uma instância do objeto);
var str = new String('olá');
console.log(str instância do objeto);
var num = novo Número(1);
console.log(num instanceof Object);
Até o próprio construtor
Copie o código do código da seguinte forma:
função A() {}
console.log(Uma instância do objeto);
console.log(String instanceof Object);
console.log(Número instância do objeto); // verdadeiro
4. Todos os construtores instanceof Function retornam verdadeiro
Copie o código do código da seguinte forma:
função A() {}
console.log(Uma instância da Função);
console.log(String instanceof Function);
console.log(Número instância da Função);
Os quatro pontos acima estão resumidos em uma frase: Se uma instância for criada por uma determinada classe ou sua subclasse, então instanceof retornará verdadeiro. Ou se o protótipo de um determinado construtor existir na cadeia interna de protótipos do objeto obj, então true será retornado. Ou seja, o resultado de instanceof não tem relação direta com o construtor em si. Isso é comum em muitos idiomas.
Uma classe Pessoa é definida em Java e a instância p retorna verdadeiro para Pessoa e Objeto.
Copie o código do código da seguinte forma:
classe Pessoa {
nome da string pública;
idade interna pública;
Pessoa (String n, int a) {
este.nome = nome;
esta.idade = a;
}
public static void main(String[] args) {
Pessoa p = nova Pessoa("John Backus", 82);
System.out.println(p instância de Pessoa);
System.out.println(p instância do objeto);
}
}
Se houver um relacionamento de herança em Java, a classe pai instanceof da subclasse também retornará verdadeiro.
Copie o código do código da seguinte forma:
//classe pai
classe Pessoa {
nome da string pública;
idade interna pública;
Pessoa (String n, int a) {
nome = nome;
idade = uma;
}
}
// subclasse
classe pública Man estende Pessoa{
universidade pública de String;
Homem(String n, int a, String s) {
super(n, uma);
universidade =s;
}
public static void main(String[] args) {
Homem mm = novo Homem("John Resig", 29, "PKU");
System.out.println(mm instanceof Man);
System.out.println(mm instanceof Person);
}
}
Sabendo disso, o seguinte desempenho em JS não é surpreendente
Copie o código do código da seguinte forma:
//Define dois construtores
função A(){}
função B(){}
A.protótipo = B.protótipo = {a: 1};
//Cria duas instâncias de construtores diferentes respectivamente
var a = new A();
var b = novo B();
console.log(uma instância de B);
console.log(b instância de A);
Vemos que aeb são criados com A e B respectivamente, mas tanto a instanceof B quanto b instanceof A são verdadeiras. Ou seja, embora a não seja criado com o construtor B, ele ainda retorna verdadeiro. Porque B.prototype existe na cadeia interna de protótipos de a.
Devido às características dinâmicas da linguagem JS, o protótipo pode ser modificado em tempo de execução, portanto não é surpreendente que o seguinte retorne falso. Como A.prototype não está mais na cadeia interna de protótipos de a, a cadeia é interrompida.
Copie o código do código da seguinte forma:
função A(){}
var a = new A();
A.prototype = {}; // Modifique dinamicamente o protótipo, observe que isso deve ser feito após a criação de um
console.log(uma instância de A);
Observe que escrever isso também quebra o primeiro ponto resumido acima: o objeto obj é criado por meio do novo Construtor, então obj instanceof Construtor é verdadeiro
Na verdade, no padrão ECMAScript (sujeito a 5.1), a implementação interna de instanceof chamará o método interno [[HasInstance]] do construtor, que é descrito a seguir
Se F for um objeto de função, quando F(V) for executado, ocorrerão os seguintes passos:
1. Se o operando esquerdo V de instanceof não for um tipo de objeto, retorne false diretamente.
Copie o código do código da seguinte forma:
var a, b = 1, c = verdadeiro, d = 'olá';
console.log(a instanceof Object); // false aqui um valor é indefinido
console.log(b instância do objeto); // falso
console.log(c instância do objeto); // falso
console.log(d instância do objeto); // falso
2/3. Obtenha o atributo protótipo do construtor F. Se não for um tipo de objeto, uma exceção TypeError deve ser lançada.
Copie o código do código da seguinte forma:
função A(){}
A.prototype = 1; // Define o protótipo de A para um tipo não-objeto
var a = new A();
console.log(uma instância de A);
Os prompts de exceção lançados por cada navegador são diferentes.
Firefox18:
Cromo24:
Safári6:
Ópera12:
IE10:
4. Execute continuamente a seguinte lógica: defina V como o V do protótipo interno, retorne falso se V for nulo e retorne verdadeiro se V e O apontarem para o mesmo objeto.