Использование 1 (обычное использование):
Выражение следующее: объект.метод.вызов(другой объект), что означает замену текущего объекта другим объектом и выполнение метода текущего объекта. Давайте сначала посмотрим на пример:
Скопируйте код кода следующим образом:
функция Класс1(){
this.name = "класс1";
this.showName = функция(){
оповещение(это.имя);
}
}
функция Класс2(){
this.name = "класс2";
}
вар c1 = новый Class1 ();
вар c2 = новый Class2 ();
c1.showName.call(c2);
c2.showName(); //Невозможно выполнить
Сначала мы определили две функции соответственно, а именно Class1 и Class2. Основное различие между ними заключается в том, что у Class2 есть на один метод showName() больше, чем у Class1. Затем определяются объекты c1 и c2, соответствующие Class1 и Class2. На данный момент мы ясно знаем, что c1 имеет метод showName(), а c2 — нет. Но произошло чудо. Когда мы выполним c1.shoName.call(c2), появится значение имени c2, то есть «class2». Фактически, мы все еще выполняем методы c1, но мы просто временно заменили объект c2 на объект c1. После выполнения они остаются такими же, как и при их определении, и у c2 больше нет методов. Чтобы определить, есть ли у c2 больше методов, в примере добавляется строка c2.showNmae(); Она не может быть выполнена, и браузер сообщит об ошибке. У объекта #<Class2> нет метода 'showName'.
Зачем это делать? Как упоминалось ранее, это временный метод использования, мы используем его просто для эффективного программирования. Но это не без ограничений. Предположим, что c1 и c2 используются для представления заменяемого объекта и замещающего объекта, а fun1 используется для представления встроенного метода c1. 1. Когда fun1 не требует параметров и не использует локальные переменные в родительской функции, фактически нет разницы между c1.fun1.call(c2) и c1.fun1(). 2. Когда fun1 не требует параметров, но; использует переменные родительской функции, тогда необходимо сгенерировать переменные, используемые fun1, с теми же именами в функциях c1 и c2 3. Когда fun1 требует параметров, форму необходимо переписать как c1.fun1.call(c2; , параметр 1, Параметр 2, ...параметр n), в этот момент имя переменной в функции, генерирующей c1, не обязательно должно иметь то же имя, что и имя переменной в функции, генерирующей c2, оно должно только совпадать. Фактически, когда мы используем call, c2 и c1 часто имеют большое сходство по структуре и функциям, поэтому трех вышеупомянутых пунктов легко избежать.
Использование два:
Используется в процессе определения функции в форме: другая существующая функция.call(this), которая может клонировать все переменные и методы другой существующей функции в свою собственную функцию, достигая функции, аналогичной наследованию. Давайте посмотрим на пример:
Скопируйте код кода следующим образом:
функция Животное(имя){
это.имя = имя;
this.showName = функция(){
оповещение(это.имя);
}
};
вар животное = новое животное («маленькое_животное»);
животное.showName(); //оповещение("маленькое_животное")
функция Cat(имя){
Animal.call(это, имя);
};
//var Animal = null; //Раскомментируйте и попробуйте
вар кот = новый кот("black_cat");
cat.showName(); //оповещение("черный_кот")