Even more jQuery?

в 8:26, , рубрики: framework, javascript

За последние несколько лет я полюбил язык Javascript. Мне прекрасно известно, сколько вокруг него обсуждений и холиваров. И я прекрасно знаю его назначение, где он может быть применим, а где нет.

Все мы хоть раз слышали о jQuery. С некоторых пор я буквально влюбился в это творение, как и в сам JavaScript. За моей спиной очень много строк кода. Рабочего, любительского, простого фонарного кода. С недавних пор я начал изучать структуру всеми любимой jQuery и пришёл к выводу, что это ничто иное, как шедевр.

Почему здесь эта статья?

На моём счету немало разработок, которыми я пытался упростить себе процесс программирования, многие из них были jQuery-like. Но увы, разработка и поддержка останавливалась и забрасывалась в силу моей занятости и они так и не вышли за пределы моего жесткого диска.

Некоторое время назад мне, уже будучи неплохо ознакомленному со структурой jQuery, пришла в голову мысль: что если сделать конструктор, где мы сами будем указывать функцию, которая будет подбирать для нас необходимые данные и собирать их в объект jQuery? Нет, здесь нет никакой речи о селекторном разборе веб-страниц, об анимациях, ajax и прочих плюшках и вкусностях jQuery. Я подумал: что если наша библиотека будет подстраиваться под требования программиста (будь то перебор банальных чисел, строк, объектов с данными или даже файлов) вне зависимости от платформы, на которой запущен данный код?

Так пришла идея собрать этот небольшой фреймворк.

Давайте разберемся, что к чему.

jQuery Builder — это микрофреймворк, предназначенный для создания jQuery-like библиотек для манипуляции различными данными. На данный момент я пока решил унаследовать класс jQuery от родного js-массива, но в будущем это будет исключено и будут созданы свои аналоги стандартных методов.

Приведу пару простых примеров:

Пример №1. Предположим, у нас есть массив данных, из которого нам нужно сформировать jQuery-объект с необходимыми методами. Пусть это будут банальные числа.

Код

// Наши числа
var numbers = [4, 8, 15, 16, 23, 42, 108];

// Сам конструктор
var builder = new JQueryBuilder(function (selector) {
	// Перебираем числа
	for(var i = 0; i < numbers.length; i++) {
		// Проверяем селектор
		switch (selector) {
			// Если мы ищем чётные числа
			case 'even' :
				// ... и число подходит под требования
				if (numbers[i] % 2 === 0) {
					// Добавляем его в выборку
					this.push(numbers[i]);
				}
				break;
			// Если мы ищем нечётные числа
			case 'even' :
				// ... и число подходит под требования
				if (numbers[i] % 2 === 0) {
					// Добавляем его в выборку
					this.push(numbers[i]);
				}
				break;
		}
	}
});

Поле jQuery содержит в себе необходимый нам объект (если быть точнее, это функция), где будет содержаться наша выборка и необходимые методы (из jQuery.fn).

Итак, мы только что выполнили первую основную задачу — мы сформировали наш конструктор. Он представляет из себя функцию, в которой исполняется цикл, перебирающий наш массив. При соответствии числа нашим требованиям число будет добавлено в выборку.

Теперь создадим новый метод. Всё делается точно так же как в настоящем jQuery — через объект fn.

Код

var $ = builder.jQuery;
$.fn.add = function (value) {
	var self = this;
	return this.each(function (i) {
		self[i] += value;
	});
};
var result = $('even').add(5);
console.log(result); // [9, 13, 21, 47, 113]

Ожидаю в комментариях эту картинку, однако здесь всё гораздо приятнее. Данная библиотека, по моему мнению, может оказаться полезной для быстрого нахождения решения частых (и не только) задач касательно массивов.

Пример №2. Теперь проделаем что-то подобное со строками.

Код

var $ = jQueryBuilder.fromArray().jQuery;
$.fn.extend({
	reverse: function () {
		var self = this;
		return this.each(function (i) {
			var result = '';
			for(var x = self[i].length - 1; x >= 0 ; x--) {
				result += self[i][x];
			}
			self[i] = result;
		});
	},
	upper: function () {
		var self = this;
		return this.each(function (i) {
			self[i] = this.toUpperCase();
		});
	},
	lower: function () {
		var self = this;
		return this.each(function (i) {
			self[i] = this.toLowerCase();
		});
	}
});
var result = $('abcde', 'xyZ', 'HAAR')
		.reverse()
		.lower()
	;

console.log(result); // ["edcba", "zyx", "raah"]

На мой взгляд, всё очень просто и понятно. В следующей статье расскажу, как применил эту библиотеку Adobe After Effects, в котором есть возможность писать скрипты на Javascript. Получился эдакий jQuery для перебора и управления слоями в композиции.

Репозиторий тут. Обещаю постепенно дополнять примерами.

Спасибо за внимание.

Автор: Serabas

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js