JQuery源代码问题

时间:2011-10-04 06:50:22

标签: jquery

我有两个关于以下代码段的问题。

(1)。 “返回新的jQuery.fn.init(选择器,上下文,rootjQuery);”的目的是什么?为什么它会在JQuery函数中返回另一个实例?

(2)。为什么将prototype.constructor重新定义为JQuery?

// Define a local copy of jQuery
var jQuery = function( selector, context ) {
        // The jQuery object is actually just the init constructor 'enhanced'
        return new jQuery.fn.init( selector, context, rootjQuery );
    },

... ...

jQuery.fn = jQuery.prototype = {
    constructor: jQuery,
    init: function( selector, context, rootjQuery ) {
        var match, elem, ret, doc;

谢谢!

2 个答案:

答案 0 :(得分:4)

  1. 当JQuery作为普通函数调用时,会创建一个新的(类)JQuery实例并使用new JQuery.fn.init(...)返回。通过这种方式,开发人员无需在new之前添加$(..)关键字。
  2. JQuery.fnJQuery.prototype的快捷方式。写JQuery.fn.customMethod = function(){...}比写JQuery.prototype.customMethod = ...更方便。由于JQuery通常也可以通过$$j访问,因此引用JQuery.prototype的简短方法是$.fn

答案 1 :(得分:1)

  

(2)。为什么将prototype.constructor重新定义为JQuery?

我认为原因是在每个jQuery对象中保留一个构造函数引用,实际上是它自己(它创建一个循环引用)。实际上,通过使用这段代码覆盖jQuery.prototype对象

jQuery.fn = jQuery.prototype = { ... }

你失去了“自动创建”的构造函数(指向它创建的函数,在本例中为jQuery.fn.init),因此你需要明确地设置它。

我发现这个链接非常有助于理解javascript原型和构造函数:

http://joost.zeekat.nl/constructors-considered-mildly-confusing.html