代码之家  ›  专栏  ›  技术社区  ›  NilColor

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

  •  19
  • NilColor  · 技术社区  · 16 年前

    小问题是jquery为什么这么做

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

    为什么不简单地加上 f1() 等入 init.prototype 是吗?是唯美还是有深刻的思想?

    2 回复  |  直到 10 年前
        1
  •  20
  •   kgiannakakis    16 年前

    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”中( 选择器,上下文);“语句,it 将原型用于它的对象 构造。这允许init()。 替换jquery构造函数 本身。

    您所实现的是,从jquery.fn.init构造函数返回的对象可以访问jquery方法。

        2
  •  47
  •   Matt Ryall    16 年前

    函数 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插件将更加冗长,并且如果实现细节发生了更改,则可能会导致将来的中断。