2009-11-18 4 views
19

Маленький расширенный вопрос, почему JQuery сделатьЗачем jQuery делать это: jQuery.fn.init.prototype = jQuery.fn?

jQuery.fn = jQuery.prototype = { 
init: function() {...}, 
    f1: function() {...}, 
    ... 
}; 
jQuery.fn.init.prototype = jQuery.fn; 

Почему бы не просто добавить f1() и т.д. в init.prototype? Это только эстетика или есть некоторые глубокие идеи?

+0

Я не уверен, что вы подразумеваете, добавив f1() в init.prototype? Он не добавляет «во что-либо», он назначает прототип. –

+0

Несомненно. Конечно, я имею в виду «назначить». Извините за мой английский.И вопрос в том, почему бы просто не назначить все функции init.prototype? Почему они назначены jQuery.prototype и jQuery.prototype, назначенные jQuery.prototype.init.prototype – NilColor

+0

Связанный вопрос о шаблоне дизайна jQuery: http://stackoverflow.com/q/12143590/1048572 – Bergi

ответ

20

jQuery.fn - просто псевдоним для jQuery.prototype. Полагаю, это определено для эстетических и менее типичных причин.

Так

jQuery.fn.init.prototype = jQuery.fn; 

фактически

jQuery.prototype.init.prototype = jQuery.prototype; 

Как, почему это должно быть сделано, это forum post полезно:

Это дает Init() функционируют так же прототип как объект jQuery. Итак, , когда вы вызываете init() как конструктор в «return new jQuery.fn.init ( селектор, контекст);" оператор, он использует этот прототип для объекта, который он создает . Это позволяет init() заменить конструктор jQuery .

Что вы достигнете, так это то, что объект, возвращенный из конструктора jQuery.fn.init, имеет доступ к методам jQuery.

+0

Да. Я знаю, что '.fn' является ярлыком для' .prototype'. Но почему они расширяют jQuery.prototype и что делают 'jQuery.fn.init.prototype = jQuery.fn'? Почему бы не расширить 'jQuery.fn.init.prototype' напрямую? – NilColor

+0

Спасибо за сообщение форума. Это мне очень помогает! – NilColor

47

Функция jQuery.fn.init - это та, которая выполняется, когда вы звоните jQuery(".some-selector") или $(".some-selector"). Вы можете увидеть это в этом фрагменте из jquery.js:

jQuery = window.jQuery = window.$ = function(selector, context) { 
    // The jQuery object is actually just the init constructor 'enhanced' 
    return new jQuery.fn.init(selector, context); 
} 

Таким образом, на самом деле, линия вы упоминаете имеет решающее значение, как JQuery позволяет добавлять функциональные возможности к объектам JQuery, как внутри самого JQuery и от плагинов. Это линия:

jQuery.fn.init.prototype = jQuery.fn; 

Назначив jQuery.fn в качестве прототипа этой функции (и потому, что первый фрагмент кода использует «новый» для лечения jQuery.fn.init в качестве конструктора), это означает, что функциональность добавлена ​​с помощью jQuery.fn.whatever немедленно появляется на объектах, возвращаемых всеми вызовами jQuery.

Так, например, простой JQuery плагин может быть создан и использован, как это:

jQuery.fn.foo = function() { alert("foo!"); }; 
jQuery(".some-selector").foo(); 

Когда вы объявляете «jQuery.fn.foo» на первой строке, что вы на самом деле делаете, добавив, что функцию для прототипа всех объектов jQuery, созданных с помощью функции jQuery, такой как вторая во второй строке. Это позволяет вам просто вызвать «foo()» по результатам функции jQuery и вызвать ваши функции плагина.

Короче говоря, написание jQuery-плагинов будет более подробным и подвержено будущему поломке, если детали реализации изменились, если эта строка не существовала в jQuery.

+2

отличный ответ, действительно имеет смысл для меня – 32423hjh32423

+0

Это самый показательный комментарий, который я прочитал за такое время. Спасибо. – asumaran

+0

Извините, что вводите вопрос в ответ/комментарии, но говорим ли мы, что добавление функции в jQuery таким образом делает эту функцию доступной для каждого элемента на странице? И делает ли эта функция доступной для вещей, отличных от элементов, таких как другие объекты jQuery и т. Д.? И, «jQuery = window.jQuery = window. $ = Function (...» просто способ показать, что все три эквивалентного синтаксиса? Или это на самом деле то, что вы бы сделали? –

Смежные вопросы