Цитата:
function jQuery( selector, context ) { return new jQuery.prototype.init( selector, context ); } jQuery.prototype = { constructor: jQuery, init: function( selector, context ) { this.selector = selector; return this; }, length: 0, selector: "", toString: function() { return "[" + this.selector + "]"; // вот это ФФ наверно и считывает при выводе в консоль } } jQuery.prototype.init.prototype = jQuery.prototype; console.log( jQuery("#someID") ); alert( jQuery("#someID") ); |
Цитата:
<script src="http://code.jquery.com/jquery-1.7.2.js"></script> <script> alert( $().toString ); </script> Цитата:
======================= Кратко ======================= Смешивает список найденных элементов с текущим (возвращаемым) объектом jQuery.
К первому немного кода: var current_jq = { }; var finded_elemenets = document.getElementsByTagName("div"); // т.к. nodelist - живой массив, замораживаем его, с помощью превращения в обычный массив. finded_elements = [].slice.call(finded_elements, 0); // переносим значения из результатов поиска в текущий экз. // так работает Array.prototype.push for(var i = 0; i < finded_elements.length; i++) { // узкий момент. тут не по документации, я просто сократил несколько вызовов до одного. if (!isNumeric(current_jq.length)) { current_jq.length = +0; } current_jq[i] = finded_elements[i]; current_jq.length++; } function isNumeric(variable) { return !isNaN(parseFloat(variable, 10)) && isFinite(variable); } *к коду сверху* С чего ты взял, что push работает именно так ? Cм документацию. Если не понятно - могу разжевать. ======================= Подробно : ======================= $.fn.init (она вызывается при $(), знаем же?) вызывает поиск Sizzle (эта штучка ищет элементы по селектору, если кто не в курсе), указывая помимо всего аргумент с именем "extra" - это объект, куда Sizzle подмешает в конце результаты поиска. Sizzle живёт в самой jQuery с именем find. (вызвать можно так : jQuery.find(bla bla bla)) В конце своём сиззл вызывает функцию makeArray, передавая ей такие аргументы : первый - NodeList найденных элементов, второй - объект (тот самый extra). её исходный код : // array - найденные элементы // results - jQuery объект, который будет возвращён. var makeArray = function( array, results ) { array = Array.prototype.slice.call( array, 0 ); if ( results ) { results.push.apply( results, array ); return results; } return array; }; что за метод push у объекта jQuery ? да самый обычный пример заимствования методов - т.е. это метод не самописный, а взятый у массивов. <script src="http://code.jquery.com/jquery-1.7.2.js"></script> <script> alert( $().push ); </script> можем убедиться в коварстве сиззла, подсунув ему что-нибудь своё : <script src="http://code.jquery.com/jquery-1.7.2.js"></script> <p>SAMPLE</p><div>LOL</div> <script> var extra = { push: function(/*elements*/) { for(var i = 0, args = arguments; i in args; i += 1) { alert("Push добавляет : "+args[i]+"\n\nСтарая длина : "+this.length); this[this.length++] = arguments[i]; } }, length: 0, context: document } jQuery.find("p, div", document, extra); </script> PS уморился. |
Часовой пояс GMT +3, время: 16:50. |