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
vsjQuery.init
)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
函数!当然不是,但是你能想到其他的应用程序吗?检查我的答案。在我看来不错,没有遗漏真正重要的要点。