gramática
Instância do objeto do construtor
parâmetro
objeto:
O objeto a ser detectado.
construtor:
Um construtor
descrever:
A instância do operador é usada para detectar se o construtor.Prototipo existe na cadeia de protótipo do objeto de parâmetro.
// Defina a função do construtor c () {} função d () {} var o = new c (); // true, porque object.getProTypeOf (o) === C.Prototypeo Instância de c; // Falso, porque d.prototipo não está na cadeia de protótipos de O Instância de D; o Instância do objeto; // true, porque object.prototype.isprototypeof (o) retorna truec.prototype de objeto // true, o mesmo que acima c.prototype = {}; var o2 = new c (); o2 instância de c; // Trueo Instância de C; // false, C.Prototype aponta para um objeto vazio, que não está na cadeia de protótipo de O.D.Prototype = new C (); // herdar var o3 = new d (); o3 instância de d; // TRUEO3 Instância de C; // verdadeiroDeve -se observar que, se a expressão da Expressão OBJ do Foo retornar verdadeira, isso não significa que a expressão retorne a termos para sempre, porque o valor da propriedade Foo.Prototype pode alterar e o valor alterado pode não existir na cadeia de protótipos OBJ, e o valor da expressão original se tornará falsa. Em outro caso, o valor da expressão original também mudará, o que é o caso em que a cadeia de protótipo do objeto Obj é alterada. Embora na especificação atual do ES, só possamos ler o protótipo do objeto e não possamos alterá-lo, ele pode ser alcançado com a ajuda do atributo __proto__ não padrão __proto__. Por exemplo, depois de executar o obj .__ proto__ = {}, a instância obj do foo retornará falsa.
Instância de objetos multi-globais (interação entre vários quadros ou várias janelas)
Em um navegador, nossos scripts podem precisar interagir entre várias janelas. Vários Windows significam vários ambientes globais e diferentes ambientes globais têm diferentes objetos globais, com diferentes construtores de tipos internos. Isso pode causar alguns problemas. Por exemplo, a expressão [] instanceof window.frames [0] .Array retornará false porque Array.prototype! == Window.Frames [0] .Array.Prototype, então você deve usar o Array.isarray (myObj) ou objeto.
Exemplo
O uso geral de instanceof é determinar se A é do tipo B:
console.log (true instância de booleano); // false console.log (novo número (1) instância do número de número); // verdadeiro
Instância de também pode determinar o tipo pai:
function father () {} function filho () {} child.prototype = new pad (); var a = new Child (); console.log (uma instância de criança); // TrueConsole.log (uma instância de pai); // verdadeiroO construtor infantil herda do pai. A instância A é sem dúvida construída pela criança, mas por que também é um exemplo de pai? De fato, o kernel da instância do operador pode ser simplesmente descrito com o seguinte código:
Verificação da função (a, b) {while (a .__ proto__) {if (a .__ proto__ === b.prototype) retorna true; a = a .__ proto__; } return false;} function foo () {} console.log (objeto de objeto de objeto === check (objeto, objeto)); // true console.log (função instanceof function === check (função, função)); // True Console.log (Instância do número do número === check (número, número)); // true console.log (string instanceof string === check (string, string)); // true console.log (instância da função do objeto === check (função, objeto)); // True Console.log (FUNÇÃO FOOF FUNCH === Check (foo, function)); // true console.log (fao instância de foo === check (foo, foo)); // true console.log (fao instância de foo === check (foo, foo)); // true console.log (fao instância de foo === check (foo, foo)); // verdadeiroSimplificando, se A for uma instância de B, então A pode definitivamente usar os métodos e propriedades definidos no protótipo de B. Em seguida, no código, significa que existem objetos com o mesmo valor em uma cadeia de protótipo com b.prototipo; portanto, siga uma cadeia de protótipo de uma camada de pesquisa por camada por camada.
Também vale a pena notar que o número da string booleano e a função são funções, e as funções são uniformemente construídas a partir da função. Eles são como qualquer função simples e podem usar as propriedades do protótipo na função:
Function.prototype.a = 10; console.log (string.a); // 10
Por fim, vamos falar brevemente sobre as duas primeiras perguntas.
// Por uma questão de conveniência de expressão, primeiro distingue a expressão esquerda e a expressão direita functionl = functionl, functionR = function; // Abaixo é gradualmente deduzido de acordo com as especificações o = functionR.Prototype = function.prototype L = functionl .__ proto__ = function.prototype // Primeiro julgamento o == l // retorna verdadeiro // Por uma questão de conveniência de expressão, primeiro distinguem a expressão esquerda e a expressão direita stringl = stringr = string = string; // abaixo é deduzido gradualmente de acordo com as especificações o = stringr.prototype = string.prototype l = stringl .__ proto__ = function.prototype // a primeira vez que os juízes o! = L // loops novamente para descobrir se ainda tem __proto__ l = string.Protótipo. __Proto__ L = String.Prototype .__ Proto__ = NULL // A terceira vez juízes l == null // retorna false