позвольте мне попытаться объяснить это. Я не читал эту книгу, но в статье Классическое наследование в JavaScript Дугласа Крокфорда есть одно важное предложение, относящееся к этому примеру о Function.prototype.method:
Это возвращает это. Когда я пишу метод
что не нужно возвращать значение, я
обычно это вернуть. Это позволяет
для каскадного программирования.
на самом деле я не знаком с этим термином, я думаю, что хорошо известным термином является « Свободный интерфейс » или «Метод цепочки», прочитайте эту страницу вики, есть примеры на разных языках, так что вы поймете это ..
PS. @ Джанлука Барджелли был немного быстрее, чтобы привести пример использования Function.prototype.method таким образом, поэтому я не публикую его в своем ответе
ADDON: как вы можете использовать его в своем примере:
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
}
Number.method('integer', function () { // you add 'integer' method
return Math[this < 0 ? 'ceil' : 'floor'](this);
})
.method('square', function () { // you add 'square' method with help of chaining
return this * this;
});
console.info( (-10/3).integer().square() ); // <- again chaining in action
вы видите, integer () возвращает объект Number, поэтому вы можете вызвать другой метод вместо записи:
var a = (-10/3).integer();
console.info( a.square() );
и несколько слов о моем способе его использования, большую часть времени я предпочитаю написать «каждый метод - новая строка с отступом, для меня этот способ более читабелен:
Function.method('add', add)
.method('sub', sub)
.method('mul', mul)
.method('div', div);
таким образом я вижу, с чего начать, и «новая строка / отступ» говорит мне, что я все еще изменяю этот объект. Сравните это с длинной строкой:
Function.method('add', add).method('sub', sub).method('mul', mul).method('div', div);
или типичный подход:
Function.method('add', add);
Function.method('sub', sub);
Function.method('mul', mul);
Function.method('div', div);
ADDON2: Обычно я использую этот подход (шаблон интерфейса Fluent), когда работаю с сущностями, например Java-код:
public class Person {
private String name;
private int age;
..
public String getName() {
return this.name;
}
public Person setName( String newName ) {
this.name = newName;
return this;
}
public int getAge() {
return this.age;
}
public Person setAge( int newAge ) {
this.age = newAge;
return this;
}
..
}
это позволяет мне легко построить Person
объект:
Person person = new Person().setName("Leo").setAge(20);
Некоторые люди делают это немного по-другому, они добавляют новые виды методов к set
/ get
и называют его with
:
public class Person {
private String name;
private int age;
..
public String getName() {
return this.name;
}
public void setName( String newName ) {
this.name = newName;
}
public Person withName( String newName ) {
this.setName( newName ); // or this.name = newName; up to you
return this;
}
public int getAge() {
return this.age;
}
public void setAge( int newAge ) {
this.age = newAge;
}
public Person withAge( int newAge ) {
this.setAge( newAge ); // or this.age = newAge; up to you
return this;
}
..
}
Теперь мой предыдущий пример выглядит так:
Person person = new Person().withName("Leo").withAge(20);
Таким образом, мы не меняем значение метода set (я имею в виду, что мы не улучшаем его, поэтому он работает, как ожидают большинство разработчиков ... по крайней мере, люди не ожидают, что метод set
может вернуть что-либо; )). Одна интересная вещь об этих специальных методах - они могут потерять свое самодокументирование, но они улучшают читаемость, когда вы их используете (как, например, при создании Person
, withName
очень хорошо говорит, что именно мы делаем ..
читать больше:
FluentInterface - описание этого шаблона Мартином Фаулером
Свободные интерфейсы в PHP
Еженедельный исходный код 14 - Fluent Interface Edition - для меня достаточно коротким и достаточно хорошим, чтобы видеть плюсы и минусы (а также ссылки на другие ресурсы)