JavaScript. Подробное руководство, 6-е издание, стр. 89
Если вы пишете метод, не имеющий собственного возвращаемого значения, подумайте о возможности возвращать из него значение this. Если неуклонно следовать этому правилу при разработке своего API, появится возможность использовать стиль программирования, известный как составление цепочек из методов, [12]
когда обращение к имени метода выполняется один раз, а затем может следовать множество вызовов его методов:
<b>shape.setX(100).setY(100).setSize(50).setOutline("red").setFill("blue").draw();</b>He путайте цепочки вызовов методов с цепочками конструкторов, которые описываются в разделе 9.7.2.
8.2.2. Вызов методов
Метод - это не что иное, как функция, которая хранится в виде свойства объекта. Если имеется функция f и объект о, то можно определить метод объекта о с именем m, как показано ниже:
<b>о.m = f;</b>После этого можно вызвать метод m() объекта о:
<b>о.m();</b>Или, если метод m() принимает два аргумента, его можно вызвать так:
<b>о.m(х, у);</b>Строка выше является выражением вызова: она включает выражение обращения к функции о.m и два выражения-аргумента, х и у. Выражение обращения к функции в свою очередь является выражением обращения к свойству (раздел 4.4), а это означает, что функция вызывается как метод, а не как обычная функция.
Аргументы и возвращаемое значение при вызове метода обрабатываются точно так же, как при вызове обычной функции. Однако вызов метода имеет одно важное отличие: контекст вызова. Выражение обращения к свойству состоит из двух частей: объекта (в данном случае о) и имени свойства (m). В подобных выражениях вызова методов объект о становится контекстом вызова, и тело функции получает возможность ссылаться на этот объект с помощью ключевого слова
<b>this</b><b>var calculator = { // Литерал объекта</b><b> ореrand1: 1, </b><b> operand2: 1, </b><b> add: function() {</b><b> // Обратите внимание, что для ссылки на этот объект используется</b><b> // ключевое слово this.</b><b> this.result = this.operandl + this.operand2:</b><b> }</b><b>};</b><b>calculator.add(); // Вызвать метод, чтобы вычислить 1+1. </b><b>calculator.result // => 2</b>Чаще всего при вызове методов используется форма обращения к свойствам с помощью оператора точки, однако точно так же можно использовать форму обращения к свойствам с помощью квадратных скобок. Например, оба следующих выражения являются выражениями вызова методов:
<b>о["m’'](х,у); // Другой способ записать это выражение: о.m(х.у).</b><b>a[0](z) // Тоже вызов метода (предполагается, что а[0] - это функция).</b>Выражения вызова методов могут включать более сложные выражения обращения к свойствам:
<b>customer.surname.toUpperCase(): // Вызвать метод объекта customer.surname </b><b>f().m(); // Вызвать метод m() возвращаемого значения функции f()</b>Методы и ключевое слово
<b>this</b>rect.setSize(width, height);
setRectSize(rect, width, height);
Гипотетически функции, вызывающиеся в этих двух строках, могут производить абсолютно идентичные действия над объектом rect (гипотетическим), но синтаксис вызова метода в первой строке более наглядно демонстрирует, что в центре внимания находится объект rect.
Обратите внимание:
<b>this</b><b>this</b>В отличие от переменных, ключевое слово
<b>this</b><b>this</b><b>this</b><b>this</b><b>undefined</b><b>this</b><b>this</b><b>var о = { // Объект о.</b><b> m: function() { // Метод m объекта.</b><b> var self = this; // Сохранить значение this в переменной,</b><b> console.log(this === о); // Выведет "true": this - это объект о.</b><b> f(); // Вызвать вспомогательную ф-цию f().</b><b> function f() { // Вложенная функция f</b><b> console.log(this === о); // "false": this - глоб. об. или undefined</b>