Как построить жидкий API, не вызывая каждый метод в цепочке

1

В жидкостных API, подобных тем, которые предусмотрены в Chalk, они дают вам возможность объединить методы вместе.

chalk.red.bgYellow('string')

Эти методы также могут использоваться сами по себе:

chalk.red('string')

Как мы можем связать их вместе без круглых скобок. Я понимаю, что каждый метод вернет объект со всеми этими свойствами и методами на нем. Я просто не понимаю, как они могут быть методом, а также объектом с методами на нем.

Я просмотрел исходный код Chalk, но он немного вышел из моей досягаемости.

  • 3
    Любая функция является объектом в JavaScript и может иметь любые свойства, которые вы ей назначаете. Обратите внимание, что в chalk.red.bgYellow red самом деле не называется.
  • 0
    Так является ли сам красный функцией конструктора?
Показать ещё 1 комментарий
Теги:

1 ответ

0
Лучший ответ

Я думаю, что это, вероятно, соответствует тому, как это достигается. По существу, у вас есть получатели на внутреннем объекте-члене. Они изменяют состояние этого объекта, а также возвращают функцию конструктора.

Затем мы добавляем методы к объекту прототипа конструктора (или через саксофон синтаксиса 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')

Ещё вопросы

Сообщество Overcoder
Наверх
Меню