为什么jQuery这样做:jQuery.fn.init.prototype = jQuery.fn?

时间:2009-11-18 10:32:58

标签: javascript jquery

小问题是为什么jQuery要做

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

为什么不简单地将f1()等添加到init.prototype?它只是审美还是有一些深刻的想法?

2 个答案:

答案 0 :(得分: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指定为此函数的原型(并且因为第一个代码段使用'new'将jQuery.fn.init视为构造函数),这意味着通过jQuery.fn.whatever添加的功能是立即可用于所有jQuery调用返回的对象。

例如,可以创建一个简单的jQuery插件并使用如下:

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

当您在第一行声明'jQuery.fn.foo'时,您实际在做的是将该函数添加到使用jQuery函数创建的所有jQuery对象的原型,如第二行中的那个。这允许您在jQuery函数的结果上简单地调用'foo()'并调用您的插件函数。

简而言之,如果实现细节发生变化,如果jQuery中不存在这一行,那么编写jQuery插件会更加冗长并且会受到未来破坏的影响。

答案 1 :(得分: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方法。