Uso 1 (uso común):
La expresión es: un object.method.call (otro objeto), que significa reemplazar el objeto actual con otro objeto y ejecutar el método del objeto actual. Veamos primero el ejemplo:
Copie el código de código de la siguiente manera:
función Clase1(){
this.nombre = "clase1";
this.showName = función(){
alerta(este.nombre);
}
}
función Clase2(){
this.nombre = "clase2";
}
var c1 = nueva Clase1();
var c2 = nueva Clase2();
c1.showName.call(c2);
c2.showName(); //No se puede ejecutar
Primero definimos dos funciones respectivamente, a saber, Class1 y Class2. La principal diferencia entre ellas es que Class2 tiene un método showName() más que Class1. Luego se definen los objetos c1 y c2 correspondientes a Class1 y Class2. En este momento, sabemos claramente que c1 tiene el método showName() pero c2 no. Pero ocurrió un milagro. Cuando ejecutamos c1.shoName.call (c2), aparecerá el valor del nombre de c2, que es "clase2". De hecho, todavía estamos ejecutando los métodos de c1, pero simplemente reemplazamos temporalmente el objeto c2 con el objeto c1. Después de la ejecución, siguen siendo los mismos que cuando se definieron y c2 no tiene más métodos. Para detectar si c2 tiene más métodos, el ejemplo agrega la línea c2.showNmae(); No se puede ejecutar y el navegador informará el error Objeto #<Clase2> no tiene método 'showName'.
¿Por qué hacer esto? Como se mencionó anteriormente, este es un método de uso temporal, solo lo usamos para una programación eficiente. Pero esto no está exento de limitaciones. Supongamos que c1 y c2 se usan para representar el objeto reemplazado y el objeto de reemplazo, y fun1 se usa para representar el método inherente de c1. 1. Cuando fun1 no requiere parámetros y no utiliza ninguna variable local en la función principal, en realidad no hay diferencia entre c1.fun1.call(c2) y c1.fun1() 2. Cuando fun1 no requiere parámetros pero; usa las variables de la función principal en, entonces es necesario generar las variables utilizadas por fun1 con los mismos nombres en las funciones de c1 y c2 3. Cuando fun1 requiere parámetros, el formulario debe reescribirse como c1.fun1.call(c2; , parámetro 1, Parámetro 2, ...parámetro n), en este momento, el nombre de la variable en la función que genera c1 no tiene que tener el mismo nombre que el nombre de la variable en la función que genera c2, solo necesita corresponder. De hecho, cuando usamos call, c2 y c1 a menudo tienen grandes similitudes en estructura y función, por lo que los tres puntos anteriores son fáciles de evitar.
Uso dos:
Se utiliza durante el proceso de definición de una función, en forma de: otra función existente.llamar (esta), que puede clonar todas las variables y métodos de otra función existente en su propia función, logrando una función similar a la herencia. Veamos un ejemplo:
Copie el código de código de la siguiente manera:
función Animal(nombre){
this.nombre = nombre;
this.showName = función(){
alerta(este.nombre);
}
};
var animal = nuevo Animal("animal_pequeño");
animal.showName(); //alerta("animal_pequeño")
función Gato(nombre){
Animal.call(este, nombre);
};
//var Animal = null; //Descomenta y pruébalo
var gato = nuevo gato("gato_negro");
cat.showName(); //alerta("gato_negro")