jQuery 构造函数将其功能映射到另一个构造函数
事实上,jQuery
它并不是真正的构造函数,也不应该被视为一个构造函数。根据定义,构造函数的职责是初始化实例属性,而jQuery
. 此外,打电话new jQuery()
是无意义的。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
.
然而,另一个正当的理由是他们可能想要somejQueryObj instanceof jQuery
返回 true,而通常不会。如果您采用上面的模式(使用 jQuery.Set),您会注意到:
jQuery() instanceof jQuery; //false
jQuery() instanceof jQuery.Set; //true
但是,如果我们将prototype
of设置jQuery
为jQuery.Set.prototype
,让我们看看会发生什么。
jQuery.prototype = jQuery.Set.prototype;
jQuery() instanceof jQuery; //true!
理解导致这些设计决策的所有事情并不容易,也许我错过了重要的点,但对我来说,他们的设计似乎过于复杂。