Primero echemos un vistazo a la explicación oficial sobre Call (), "Llamar a un método de un objeto y reemplazar el objeto actual con otro objeto". Después de leer esta explicación, puede estar aún más confundido. Ver ejemplo:
La copia del código es la siguiente:
var x = "Soy una variable global"; // Definir variable global x
función a () {// Definir la estructura de la clase de funciones a
this.x = "Lo declaré en la estructura de la clase de función a";
}
// Definir una función normal y aparecer el valor de la variable x contenida en el puntero actual.
función f () {
alerta (this.x);
}
// El valor de retorno es "Declaré en la estructura de la clase de función A"
F.call (nuevo A ());
Entiendo que F.call (nuevo A ()) es copiar la función (en realidad un objeto) F al objeto llamado "nuevo A ()" para el análisis. De hecho, es lo mismo que el resultado de análisis del siguiente código:
La copia del código es la siguiente:
función a () {
this.x = "Lo declaré en la estructura de la clase de función a";
alerta (this.x);
}
a();
Es solo que el alcance de la variable x es diferente en este momento. Sí ... parece tener un poco de herencia, ¿no? En el ejemplo anterior, F es completamente heredado por el objeto de fuerza del constructor a. Si esto no es suficiente para mostrar que A.Call (b) es un modo de herencia, entonces veamos un uso más heredado.
La copia del código es la siguiente:
función f () {
this.a = "A";
this.b = function () {
alerta ("b");
}
}
función e () {
F.call (esto);
}
var c = new E ();
alerta (CA); // Popt A
cb (); // Popt B
En este ejemplo, mientras los amigos que sepan cómo usar el navegador, pueden ver que E hereda completamente las propiedades y métodos de F, de lo contrario no se explicará, porque los atributos A y B no están definidos en E. Luego, según el sentido común, estas dos propiedades no aparecerán en el objeto de instancia c de e.