Метод – это не что иное, как функция, которая хранится в свойстве объектаи вызывается посредством этого объекта. Не забывайте, что функции – это всего лишь значения данных, а в именах, с которыми они определены, нет ничего не_ обычного. Поэтому функции могут присваиваться любым переменным, равно
8.4. Функции как методы
как и свойствам объектов. Например, если имеется функция f и объект o, вполне возможно так определить метод с именем m:
o.m = f;
Определив в объекте o метод m(), к нему можно обратиться следующим образом:
o.m();
Или, если метод m() ожидает получить два аргумента:
o.m(x, x+2);
Методы обладают одним очень важным свойством: объект, посредством которо_ го вызывается метод, становится значением ключевого слова this в теле метода. То есть когда вызывается метод o.m(), в теле метода можно получить доступ к объекту o с помощью ключевого слова this. Это утверждение демонстрируется в следующем примере:
var calculator = { // Литерал объекта
operand1: 1,
operand2: 1,
compute: function( ) {
this.result = this.operand1 + this.operand2;
}
};
calculator.compute();
//
Сколько
будет 1+1?
print(calculator.result);
//
Выводит
результат
Ключевое слово this играет очень важную роль. Любая функция, вызываемая как метод, получает в свое распоряжение дополнительный неявный аргумент – объект, посредством которого эта функция была вызвана. Как правило, методы выполняют некоторые действия над этим объектом, таким образом, синтаксис вызова методов наглядно отражает тот факт, что функция оперирует объектом. Сравните следующие две строки программы:
Гипотетически функции, вызывающиеся в этих двух строках, могут произво_ дить абсолютно идентичные действия над объектом rect (гипотетическим), но синтаксис вызова метода в первой строке более наглядно демонстрирует, что в центре внимания находится объект rect. (Если первая строка не показалась вам более естественной, это означает, что у вас еще нет опыта объектно_ориенти_ рованного программирования.)
Когда функция вызывается как функция, а не как метод, ключевое слово this ссылается на глобальный объект. Самое странное, что это верно даже для функ_ ций (если они вызываются как функции), вложенных в методы, которые в свою очередь вызываются как методы. Ключевое слово this имеет одно значение в объ_ емлющей функции и ссылается на глобальный объект в теле вложенной функ_ ции (что интуитивно совершенно не очевидно).
Обратите внимание: this – это именно ключевое слово, а не имя переменной или свойства. Синтаксис JavaScript не допускает возможность присваивания значе_ ний элементу this.