Uso 1 (uso comum):
A expressão é: an object.method.call(outro objeto), que significa substituir o objeto atual por outro objeto e executar o método do objeto atual. Vejamos o exemplo primeiro:
Copie o código do código da seguinte forma:
função Classe1(){
this.name = "class1";
this.showName = function(){
alerta(este.nome);
}
}
função Classe2(){
this.name = "class2";
}
var c1 = nova Classe1();
var c2 = nova Classe2();
c1.showName.call(c2);
c2.showName(); //Não pode ser executado
Primeiro definimos duas funções respectivamente, nomeadamente Class1 e Class2. A principal diferença entre elas é que Class2 tem mais um método showName() do que Class1. Em seguida, os objetos c1 e c2 correspondentes a Class1 e Class2 são definidos. Neste momento, sabemos claramente que c1 possui o método showName(), mas c2 não. Mas um milagre aconteceu. Quando executamos c1.shoName.call(c2), o valor do nome de c2 aparecerá, que é "class2". Na verdade, ainda estamos executando os métodos de c1, mas apenas substituímos temporariamente o objeto c2 pelo objeto c1. Após a execução, eles ainda são os mesmos de quando foram definidos e c2 não possui mais métodos. Para detectar se c2 possui mais métodos, o exemplo adiciona a linha c2.showNmae(); Não pode ser executado e o navegador reportará o erro Object #<Class2> has no method 'showName'.
Por que fazer isso? Como mencionado antes, este é um método de uso temporário, apenas o usamos para uma programação eficiente. Mas isso tem limitações. Suponha que c1 e c2 sejam usados para representar o objeto substituído e o objeto de substituição, e fun1 seja usado para representar o método inerente de c1. 1. Quando fun1 não requer parâmetros e não usa nenhuma variável local na função pai, na verdade não há diferença entre c1.fun1.call(c2) e c1.fun1(); usa as variáveis da função pai em, então é necessário gerar as variáveis usadas por fun1 com os mesmos nomes nas funções de c1 e c2 3. Quando fun1 requer parâmetros, o formulário deve ser reescrito como c1.fun1.call(c2); , parâmetro 1, Parâmetro 2, ...parâmetro n), neste momento o nome da variável na função que gera c1 não precisa ter o mesmo nome do nome da variável na função que gera c2, apenas precisa corresponder. Na verdade, quando usamos call, c2 e c1 geralmente têm grandes semelhanças em estrutura e função, portanto, os três pontos acima são fáceis de evitar.
Uso dois:
Usado durante o processo de definição de função, na forma de: outra função.call(this) existente, que pode clonar todas as variáveis e métodos de outra função existente em sua própria função, obtendo uma função semelhante à herança. Vejamos um exemplo:
Copie o código do código da seguinte forma:
função Animal(nome){
este.nome = nome;
this.showName = function(){
alerta(este.nome);
}
};
var animal = new Animal("animal_pequeno");
animal.showName(); //alert("pequeno_animal")
função Gato(nome){
Animal.call(este, nome);
};
//var Animal = null; //Descomente e experimente
var gato = new Gato("gato_preto");
cat.showName(); //alert("black_cat")