构造 jQuery 对象的总体源码结构
1 | /** |
为什么要在构造函数 jQuery()内部用运算符 new 创建并返回另一个构造函数的实例
如果构造函数有返回值, 运算符 new 所创建的对象会被丢弃, 返回值将作为 new 表达式的值
jQuery 利用这一特性, 通过在构造函数 jQuery() 内部用运算符 new 创建并返回另一个构造函数的实例, 省去构造函数 jQuery() 前面的运算符 new
为什么执行 jQuery.fn = jQuery.prototype, 设置 jQuery.fn 指向构造函数 jQuery() 的原型对象 jQuery.prototype
jQuery.fn 是 jQuery.prototype 的简写, 方便拼写
jQuery() 构造函数返回的 jQuery 对象实际是 jQuery.fn.init() 的实例, 为什么能够在 jQuery.fn.init() 的实例上调用构造函数 jQuery()的原型方法和属性
用 jQuery()构造函数的原型对象覆盖了构造函数 jQuery.fn.init()的原型对象, 从而使得 jQuery.fn.init() 的实例也可以访问 jQuery()构造函数的原型方法核属性
1 | jQuery.fn.init.prototype = jQuery.fn; |
为什么在构造 jQuery()构造函数的时候, 要包裹在一个自调用匿名函数中
在自调用安徽省农户中定义了很多其他局部变量, 这些局部变量只在 jQuery 对象内部使用, 使用自调用匿名函数可以减少与其他模块的耦合度
为什么要覆盖构造函数 jQuery()的原型对象 jQuery.prototype
在原型对象 jQuery.prototype 上定义的属性和方法会被所有 jQuery 对象继承,可以有效减少每个 jQuery 对象所需的内存。事实上,jQuery 对象只包含 5 种非继承属性,其余都继承自原型对象 jQuery.prototype;在构造函数 jQuery.fn.init()中设置了整型属性、length、selector、context;在原型方法.pushStack()中设置了 prevObject。因此,也不必因为 jQuery 对象带有太多的属性和方法而担心会占用太多的内存。