Сделать методы объекта цепочечными, чтобы вызовы шли единой последовательностью
Реализуйте небольшой StringBuilder, чтобы его изменяющие методы можно было вызывать цепочкой: new StringBuilder().append('a').append('b').upper().value должно дать 'AB'. Сделайте append(s) и upper() цепочечными методами и аксессор value, возвращающий собранную строку.
class StringBuilder {
constructor() {
this.str = '';
}
append(s) {
// ваш код здесь
}
upper() {
// ваш код здесь
}
get value() {
return this.str;
}
}
Допишите реализацию.
Каждый изменяющий метод обновляет состояние экземпляра и затем делает return this. Возврат того же объекта позволяет следующему вызову в цепочке работать с ним, поэтому append('a').append('b').upper() читается как единая последовательность. Завершающий геттер value возвращает сам результат, так как завершает цепочку — ровно так делает текучие API jQuery.
- ✗Возвращать изменённое поле (
this.str) вместоthis, что ломает следующий вызов метода - ✗Ничего не возвращать (
undefined), из-за чего второй метод цепочки бросает ошибку - ✗Мутировать в
append, но забывать, чтоupper()тоже должен делатьreturn this, чтобы оставаться цепочечным
- →Почему цепочечный метод должен возвращать
this, а не обновлённое значение? - →Чем нецепочечный завершающий метод вроде
valueотличается от цепочечных?
Решение
Каждый изменяющий метод меняет состояние и возвращает this.
class StringBuilder {
constructor() {
this.str = '';
}
append(s) {
this.str += s;
return this;
}
upper() {
this.str = this.str.toUpperCase();
return this;
}
get value() {
return this.str;
}
}
new StringBuilder().append('a').append('b').upper().value; // 'AB'
Как это работает
Текучесть API держится на одном правиле: изменяющий метод возвращает this — тот же экземпляр. Следующий вызов в цепочке выполняется на этом же объекте, поэтому append('a').append('b').upper() накапливает изменения в одном StringBuilder.
Геттер value цепочку завершает: он возвращает не объект, а собранную строку, поэтому ставится в конце. Если бы изменяющий метод вернул this.str, следующий .append искался бы у строки, а не у построителя, и цепочка бы сломалась.