Sabemos que el operador instancia de se utiliza para comprobar si un objeto es una instancia de un constructor. Los diversos escenarios en los que devuelve verdadero se enumeran a continuación.
1. El objeto obj se crea mediante un nuevo Constructor, luego la instancia de obj del Constructor es verdadera
Copie el código de código de la siguiente manera:
función Persona(n, a) {
este.nombre = n;
esta.edad = a;
}
var p = nueva Persona('John Backus', 82);
console.log(p instanciade Persona); // verdadero
2. Si existe una relación de herencia, la instancia de la subclase y la clase principal también devolverán verdadero.
Copie el código de código de la siguiente manera:
función A(){}
función B(){}
B.prototype = new A(); // B hereda de A
var b = nuevo B();
console.log(b instancia de A); // verdadero
3. Dado que Object es la clase raíz, todas las demás clases personalizadas heredan de ella, por lo que la instancia de Object de cualquier constructor devuelve verdadero.
Copie el código de código de la siguiente manera:
función A() {}
var a = nueva A();
console.log(una instancia de Objeto); // verdadero
var str = new String('hola');
console.log(cadena instancia del objeto); // verdadero
var num = nuevo Número(1);
console.log(núm instancia del objeto);
Incluso el propio constructor
Copie el código de código de la siguiente manera:
función A() {}
console.log(Una instancia de Objeto); // verdadero
console.log (instancia de cadena del objeto); // verdadero
console.log(Número de instancia del objeto); // verdadero
4. Todos los constructores de la función instancia devuelven verdadero
Copie el código de código de la siguiente manera:
función A() {}
console.log(Una instancia de función); // verdadero
console.log (instancia de cadena de función); // verdadero
console.log(Número de instancia de función); // verdadero
Los cuatro puntos anteriores se resumen en una oración: si una determinada clase o su subclase crea una instancia, entonces instancia de devuelve verdadero. O si el prototipo de un determinado constructor existe en la cadena de prototipo interna del objeto obj, entonces se devuelve verdadero. Es decir, el resultado de instancia de no tiene relación directa con el propio constructor. Esto es común en muchos idiomas.
Una clase Persona se define en Java y la instancia p devuelve verdadero tanto para Persona como para Objeto.
Copie el código de código de la siguiente manera:
clase Persona {
nombre de cadena pública;
edad interna pública;
Persona (Cadena n, int a) {
this.nombre = nombre;
esta.edad = a;
}
público estático vacío principal (String [] argumentos) {
Persona p = nueva Persona("John Backus", 82);
System.out.println(p instanciade Persona);
System.out.println(p instancia de Objeto);
}
}
Si existe una relación de herencia en Java, la instancia de la clase principal de la subclase también devuelve verdadero.
Copie el código de código de la siguiente manera:
// clase padre
clase Persona {
nombre de cadena pública;
edad interna pública;
Persona (Cadena n, int a) {
nombre = nombre;
edad = a;
}
}
// subclase
clase pública Hombre extiende Persona{
universidad pública de cuerdas;
Hombre(Cadena n, int a, Cadena s) {
super(norte, a);
universidad = s;
}
público estático vacío principal (String [] argumentos) {
Hombre mm = nuevo Hombre("John Resig", 29, "PKU");
System.out.println(mm instancia de Man); // verdadero
System.out.println(mm instancia de Persona); // también es verdadero
}
}
Sabiendo esto, el siguiente desempeño en JS no es sorprendente
Copie el código de código de la siguiente manera:
//Definir dos constructores
función A(){}
función B(){}
A.prototipo = B.prototipo = {a:1};
//Crea dos instancias de constructores diferentes respectivamente
var a = nueva A();
var b = nuevo B();
console.log(una instancia de B); // verdadero
console.log(b instancia de A); // verdadero
Vemos que a y b se crean con A y B respectivamente, pero tanto una instancia de B como b instancia de A son verdaderas. Es decir, aunque a no se crea con el constructor B, aún devuelve verdadero. Porque B.prototype existe en la cadena de prototipos interna de a.
Debido a las características del lenguaje dinámico de JS, el prototipo se puede modificar en tiempo de ejecución, por lo que no es sorprendente que lo siguiente devuelva falso. Debido a que A.prototype ya no está en la cadena de prototipos interna de a, la cadena se interrumpe.
Copie el código de código de la siguiente manera:
función A(){}
var a = nueva A();
A.prototype = {}; // Modifica dinámicamente el prototipo, tenga en cuenta que debe hacerse después de crear un
console.log(una instancia de A); // falso
Tenga en cuenta que escribir esto también rompe el primer punto resumido anteriormente: el objeto obj se crea a través del nuevo Constructor, luego obj instancia del Constructor es verdadero
En realidad, en el estándar ECMAScript (sujeto a 5.1), la implementación interna de instancia de llamará al método interno [[HasInstance]] del constructor, que se describe a continuación
Si F es un objeto de función, cuando se ejecuta F (V), se producirán los siguientes pasos:
1. Si el operando izquierdo V de instancia de no es un tipo de objeto, devuelve falso directamente.
Copie el código de código de la siguiente manera:
var a, b = 1, c = verdadero, d = 'hola';
console.log(una instancia de Objeto); // falso aquí un valor no está definido
console.log(b instancia de Objeto);
console.log(c instancia de Objeto);
console.log(d instancia de Objeto);
2/3. Obtenga el atributo prototipo del constructor F. Si no es un tipo de objeto, se debe generar una excepción TypeError.
Copie el código de código de la siguiente manera:
función A(){}
A.prototype = 1; // Establece el prototipo de A en un tipo que no sea de objeto
var a = nueva A();
console.log (una instancia de A);
Los mensajes de excepción generados por cada navegador son diferentes.
Firefox18:
Cromo24:
Safari6:
Ópera12:
IE10:
4. Ejecute continuamente la siguiente lógica: establezca V en la V del prototipo interno, devuelva falso si V es nulo y devuelva verdadero si tanto V como O apuntan al mismo objeto.