В жидкостных API, подобных тем, которые предусмотрены в Chalk, они дают вам возможность объединить методы вместе.
chalk.red.bgYellow('string')
Эти методы также могут использоваться сами по себе:
chalk.red('string')
Как мы можем связать их вместе без круглых скобок. Я понимаю, что каждый метод вернет объект со всеми этими свойствами и методами на нем. Я просто не понимаю, как они могут быть методом, а также объектом с методами на нем.
Я просмотрел исходный код Chalk, но он немного вышел из моей досягаемости.
Я думаю, что это, вероятно, соответствует тому, как это достигается. По существу, у вас есть получатели на внутреннем объекте-члене. Они изменяют состояние этого объекта, а также возвращают функцию конструктора.
Затем мы добавляем методы к объекту прототипа конструктора (или через саксофон синтаксиса es6), который устанавливает состояние внутреннего объекта, а также вызывает метод для этого объекта (например, log()
). Эти методы также устанавливают состояние внутреннего объекта.
Это определенно может быть более чистым, но я думаю, что на практике такой тип функциональности достигается.
Если у кого есть какие-то мысли, дайте мне знать.
Одно замечание: сначала я возвращал объект
chk
из конструктора. Конечно, это не работает, потому что у нас нет объекта-прототипа в нашей конструкторской функции, то есть я не могу добавлять к нему методы. Это случай непрерывного возврата функции конструктора и доступа к внутреннему состоянию объекта из методов прототипа.
const Chalk = function () {
const _this = this
this.chk = {
get red () {
this.color = 'red'
return _this
},
get blue () {
this.color = 'blue'
return _this
},
get bgYellow () {
this.bg = 'yellow'
return _this
},
get bgBlue () {
this.bg = 'blue'
return _this
},
log(msg) {
this.msg = msg
console.log('color: ${this.color} \nbg: ${this.bg} \nmsg: ${this.msg}
')
}
}
}
Chalk.prototype.red = function (msg) {
this.chk.color = 'red'
this.chk.log(msg)
}
Chalk.prototype.blue = function (msg) {
this.chk.color = 'blue'
this.chk.log(msg)
}
const chalk = new Chalk().chk
chalk.bgYellow.blue('test')
chalk.red.bgYellow
red
самом деле не называется.