Дисциплины - Объектно-ориентированное программирование

ООП в JavaScript - Функции JavaScript - Косвенный вызов, методы call() и apply()

Методы call() и apply() позволяют выполнить косвенный вызов функции, как если бы она была методом другого объекта. Первым параметром ободим методам передается объект, относительно которого вызывается функция, этот аргумент определяет ключевое слово this в теле функции.

Чтобы вызвать функцию без аргументов, ка метод объекта o, можно использовать любой из методов: call() или apply().

f.call(o);
f.apply(o);

call()

Метод call может применяться для вызова функции в контексте нужного объекта:

call()
var Animal1 = {name: 'Cat'}
var Animal2 = {name: 'Dog'}

function sayName() {
    // this — ссылка на объект, в контексте которого вызвана функция
    alert(this.name);
}

sayName.call(Animal1) // выдаст сообщение "Cat"
sayName.call(Animal2) // выдаст сообщение "Dog"

При этом совершенно не важно, какому объекту принадлежит функция. В качестве текущего(this) объекта будет взят первый аргумент.

var Animal1 = {
    name: 'Cat',
    sayName: function() {
        alert(this.name);
    }
};

var Animal2 = {name: 'Dog'};

Animal1.sayName() // выдаст сообщение "Cat"
Animal1.sayName.call(Animal2) // выдаст сообщение "Dog"

Помимо смены контекста вызова, метод call может передавать в функцию аргументы:

var obj = {attr: 10};

function sum(a, b) {
    alert(this.attr + a + b);
}

sum.call(obj, 5, 2) // выдаст сообщение с результатом "17"

Если контекст вызова не указан, то функция будет выполнятся в контексте заданного объекта:

window.a = 5
function sayThis() {     
     alert(this.a);
}

sayThis.call() // выдаст 5

window.a = 5
function sayThis(b) {     
     alert(this.a + b);
}

sayThis.call(null, 3) // выдаст 8

apply()

Метод apply() действует точно также, как метод call(), за исключением того, что apply() аргументы для функции передает ввиде элементов массива:

f.apply(o,1,2);

Метод apply() получает массив аргументов и вызывает функцию, как будто каждый элемент массива является отдельным аргурментом вызова функции. Поэтому он полезен для вызова вариативных (с неизвестным количеством аргументов) функций с вычисляемым массивом аргументов.

Кроме массива аргументов, метод apply получает первый аргрумент, указывающий на вариант связывания this для вызываемой функции. Если функция не ссылается на this, ей можно передать null.

var score = [0,1,2]
average.apply(null, score);
// это будет равносильно вызову average(score[0], score[1], score[2])

Если функция ссылается на this, то необходимо вместо null указать объект, в котором находятся ссылки this.

var obj = {}
var scor = [0,1,2]
average.apply(obj, score);
// это будет равносильно вызову: {obj.average(scor[0],scor[1],scor[2])

Т.е. функция average превратилась в метод объекта obj.

Еще один пример использования apply():

var test = [1,7,2,20];
alert(sum.apply(null, test));   //выведет 30

Количество комментариев: 0

Для того, чтобы оставить коментарий необходимо зарегистрироваться
814301 БГУИР
814302 БГУИР
814303 БГУИР
894351 БГУИР
90421 БГУИР


Изображения Видео

1. Абстрактная фабрика https://www.youtube.com/watch?v=1mVONOCxfLg
2. Фабричный метод https://www.youtube.com/watch?v=5UqUDR6_2cY
3. Шаблон декоратор https://www.youtube.com/watch?v=Lwb9bm8yKD0
4. Dessign patterns on PHP https://github.com/domnikl/DesignPatternsPHP
5. Приёмы объектно-ориентированного проектирования. Паттерны проектирования Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес; [пер. с англ.: А. Слинкин науч. ред.: Н. Шалаев]. — Санкт-Петербург [и др.] : Питер, 2014. — 366 с. : ил. ; 24 см.
6. Приемы объектно-ориентированного проектирования. Паттерны проектирования Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес; [пер. с англ.: А. Слинкин науч. ред.: Н. Шалаев]. — Санкт-Петербург [и др.] : Питер, 2014. — 366 с. : ил. ; 24 см.
7. Ajax http://erud.by/ajax
8. Ajax http://erud.by/ajax
9. Ajax http://erud.by/ajax
10. Документация Laravel http://laravel.com
Задание к курсовой работе
Задание к курсовой работе
Вопросы к экзамену