我是reading this article about how jQuery works,那篇文章将jquery结构缩小为符号代码:
/*1*/ var jQuery = (function ()
/*2*/ {
/*3*/
/*4*/
/*5*/ var jQuery = function (selector, context)
/*6*/ {
/*7*/
/*8*/
/*9*/ return new jQuery.fn.init(selector, context, rootjQuery);
/*10*/ },
/*11*/ rootjQuery;
/*12*/
/*13*/
/*14*/ jQuery.fn = jQuery.prototype = {
/*15*/ constructor: jQuery,
/*16*/ init: function (selector, context, rootjQuery)
/*17*/ {
/*18*/
/*19*/ if (!selector)
/*20*/ {
/*21*/ return this;
/*22*/ }
/*23*/ },
/*24*/ //I screwed with the core!
/*25*/
/*26*/ yo: function ()
/*27*/ {
/*28*/ alert("yo")
/*29*/ },
/*30*/ };
/*31*/
/*32*/ jQuery.fn.init.prototype = jQuery.fn;
/*33*/
/*34*/ // Expose jQuery to the global object
/*35*/ return jQuery;
/*36*/ })();
线#32
是神奇发生的地方。所以当我写jQuery(..)
时,它实际上运行new init()
,可以访问所有jQuery.fn
个函数。
很明显(大部分)但我有两个问题:
问题#1 为什么行#15
(constructor: jQuery,
)存在?它所做的一切(imho)是告诉prototype
对象ctor function
是jQuery
。 jQuery如何使用这个事实?
问题#2 查看第#14
行,显然在jQUery.fn
中添加了函数(我们的示例中的函数yo
- 行#26
)
但为什么jQuery.prototype
(第14行中间)也有这些功能(它将它们设置为prototype
...)?这就像我们要做的$.addClass()
无效。
答案 0 :(得分:2)
为什么第15行(
constructor: jQuery,
)存在?所有它(imho)是告诉原型对象它的ctor函数是jQuery。
是。人们确实希望找到new jQuery().constructor == jQuery
。
jQuery如何使用这个事实?
例如,pushStack
internal method uses this.constructor()
用于创建新实例 - 这也允许inheritance from jQuery。
但是为什么jQuery.prototype(第14行中间版)也有这些[jQuery.fn]函数(它将它们设置为它的原型......)?
引用this answer:
背后的原因之一当然是他们想要的 容纳可能修改
jQuery.prototype
的人而非jQuery.fn
。然而另一个正当理由是他们可能想要
somejQueryObj instanceof jQuery
返回true,而它 通常不会。
就像我们要做的
$.addClass()
无效。
不,怎么回事?您是否将每个(构造函数)函数的标准.prototype
属性与内部原型链混淆?