Javascript 为什么jQuery构造函数映射到jQuery.fn.init?

Javascript 为什么jQuery构造函数映射到jQuery.fn.init?,javascript,jquery,Javascript,Jquery,jQuery构造函数排序将其功能映射到另一个构造函数,jQuery.fn.init: jQuery = function( selector, context ) { return new jQuery.fn.init( selector, context, rootjQuery ); }, 我想知道为什么 这仅仅是出于组织目的吗?作者不是将init函数放在jQuery构造函数定义中,而是想将其打包 有什么理由在原型上使用.init()方法吗?我认为没有人使用过$('.someth

jQuery
构造函数排序将其功能映射到另一个构造函数,
jQuery.fn.init

jQuery = function( selector, context ) {
    return new jQuery.fn.init( selector, context, rootjQuery );
},
我想知道为什么

这仅仅是出于组织目的吗?作者不是将init函数放在jQuery构造函数定义中,而是想将其打包

有什么理由在原型上使用
.init()
方法吗?
我认为没有人使用过
$('.something')…init()…

表明原型上不必有
.init

我刚刚发现Dan Herbert的答案表明它只是为了结构/可读性

总之,我可以确认这个构造函数/原型映射有趣的业务是不必要的吗?在我看来,
jQuery.fn.init
功能可以:

  • 关闭中的任何地方
  • jQuery
    对象上(
    jQuery.init
    vs
    jQuery.fn.init
  • 或者,对我来说最有意义的是:直接在
    jQuery
    函数/构造函数定义内部,替换
    newjquery.fn.init
    并避免
    jQuery.fn.init.prototype=jQuery.fn
    映射

它允许您链接构造函数。有点

所以不是

$('.someClass').hide();
$('.someOtherClass').hide();
你能行

$('.someClass').hide().init.call($.fn, '.someOtherClass').hide();
这很管用,但也是个笑话

jQuery构造函数将其功能映射到另一个 建造师

事实上,
jQuery
不是真正的构造函数,也不应该被视为构造函数。根据定义,构造函数的职责是初始化实例属性,而
jQuery
的情况并非如此。另外,调用
newjquery()
也没有意义
jQuery
是一个工厂函数,用于创建
jQuery.fn.init
实例,仅此而已

现在,您可能想知道为什么他们不使用
jQuery
作为真正的构造函数

因为他们不想要我们一直用
new
调用的构造函数,所以他们想要一个工厂函数。这对我来说很好,但是我倾向于不同意的是,他们的模式非常隐晦,不能完全反映意图

在我看来,选择更好的名字会更好:

function jQuery(selector, context) {
    return new jQuery.Set(selector, context);
}

jQuery.Set = function (selector, context) {
    //constructor logic
};

//allows syntaxic sugar
jQuery.fn = jQuery.Set.prototype = {
    constructor: jQuery.Set,
    //methods
};
我几乎只将
jQuery.fn.init
重新映射到
jQuery.Set
,这一切突然变得对我更有意义。当查看上面的代码时,很容易看到:

  • jQuery
    是一个工厂函数,用于创建
    jQuery.Set
    对象
  • jQuery.fn
    仅作为一种合成糖存在,而不必一直编写
    jQuery.Set.prototype
    来修改原型
  • 现在,在源代码中,我们还看到他们执行了以下操作,这有点不合理,因为
    jQuery
    不是真正的构造函数,它是
    jQuery.prototype.init
    ,而且因为我们没有创建
    jQuery
    实例,所以设置
    jQuery.prototype
    似乎没用:

    jQuery.fn = jQuery.prototype = {
          constructor: jQuery
    
    这背后的一个原因当然是他们想要容纳那些可能修改
    jQuery.prototype
    而不是
    jQuery.fn
    的人

    然而,另一个合理的原因是,他们可能希望jQuery的
    somejQueryObj instanceof
    返回true,而通常不会返回true。如果采用上述模式(使用jQuery.Set),您将注意到:

    jQuery() instanceof jQuery; //false
    jQuery() instanceof jQuery.Set; //true
    
    但是,如果我们将
    jQuery
    prototype
    设置为
    jQuery.set.prototype
    ,让我们看看会发生什么

    jQuery.prototype = jQuery.Set.prototype;
    jQuery() instanceof jQuery; //true!
    

    要理解导致这些设计决策的所有因素并不容易,也许我忽略了重要的一点,但对我来说,他们的设计似乎过于复杂。

    也许可以看看-是的,
    init
    有点不必要,但他们想公开实际的构造函数。现在有了答案,它是重复的:-)可能是的,但您永远不会想在
    $.fn
    原型对象上应用
    init
    函数!当然不是,但是你能想到其他的应用程序吗?检查我的答案。在我看来不错,没有遗漏真正重要的要点。