На самом деле jQuery это просто набор функции Javascript, предоставленных в особом виде (с помощью функции $, jQuery).
Так всеми любимый селектор происходит из стандартной javascript-функции document.querySelectorAll("div")
Если Вы не знаете, что такое замыкание, то почитайте статью она может помочь.
Обработчика CSS-селектора aka наша главная функция:
Это главная функция, она служит для обработки входящих jQuery запросов и превращает найденные элементы в массив.
В прототипе храним функции и свойства для нашей библиотеки. Они наследуются при объявлении.
При прохождении массива, объекты берутся из "специального" свойства "this.objects", DOM-элементы в которую заносятся в селекторе.
Оболочка нашей библиотеки _
Как селектор $ для jQuery
Наш селектор будет вызываться с помощью _("#element-id") , например
Вызов нашей библиотеки выглядит следующим образом:

Рисунок 1. Результат
Таким образом можно дорабатывать и пополнять библиотеку новыми функциями.
Прицип работы с этим инструментом очень схож с jQuery.
p.s. На фото селфи Curosity с Марса
Спасибо за внимание.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | function myLib (arg){ if(typeof arg=="string"){ //превращает полученные объекты в массив и возвращает в собственную функцию return new myLib(Array.prototype.slice.call(document.querySelectorAll(arg))); } //обрабатывает массив объектов, записывает их //в результирующий массив в удобном виде if(typeof arg!="string" && typeof arg!="undefined"){ for(var i in arg){ this[i]=arg[i]; } //устанавлиевается для обработки полученного результата this.objects=arg; //сохраняется для удобного прохождение //результата с помощью for (i=0; i<n; i++) this.length=arg.length; } this.updateEnum(); return this;} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | myLib.prototype=new function (arg){ //обработка объектов функцией css this.css=function(a,b //Если !b, то есть если 1 аргумент if(!b){ return eval("this.objects[0].style."+a); }else{ //Иначе 2 аргумента for(var i in this.objects){ eval("this.objects["+i+"].style."+a+"='"+b+"';"); } } return this; } //toArray возвращает обычным массивом все объекты //(функция для примера) this.toArray=function(){return this.objects;} this.objects=[]; this.length=0; //splice объявляется для того, чтобы в консоли //результат работы функции выдавался как массив //хотя на самом деле это другой объект this.splice=function(){}; this.updateEnum=function(){ for(var i in this){ //изменение enumerable, для того, что for не проходил //по ненужным элементам возвращаемого объекта if(i*1!=i) Object.defineProperty(this, i, { value: this[i], enumerable: false, writable: false, configurable: false }); } }}; |
1 | var _ = function (arg){ return new myLib(arg); } |
1 2 3 4 5 6 7 8 | <font color="#000000">//получим "массив" c единственным объектом <div id='test-lib'></div>_("#test-lib")//применим пару css-свойств_("#test-lib").css("padding","25px").css("background","#f00");//проверим наш самописный "getter"_("#test-lib")[0].innerHTML+="<br>padding of this = "+_("#test-lib").css("padding");</font><br> |
Тест работы библиотеки по клику.
onclick='_("#test-lib").css("padding",Math.random()*50+"px").css("background","#aaf")'
onclick='_("#test-lib").css("padding",Math.random()*50+"px").css("background","#aaf")'

Рисунок 1. Результат
Спасибо за внимание.