jQuery结构 - 澄清?

时间:2014-03-07 11:35:16

标签: javascript jquery

我是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 为什么行#15constructor: jQuery,)存在?它所做的一切(imho)是告诉prototype对象ctor functionjQuery。 jQuery如何使用这个事实?

问题#2 查看第#14行,显然在jQUery.fn中添加了函数(我们的示例中的函数yo - 行#26

但为什么jQuery.prototype(第14行中间)有这些功能(它将它们设置为prototype ...)?这就像我们要做的$.addClass() 无效

1 个答案:

答案 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属性与内部原型链混淆?