0%

jQuery源码-构造函数jQuery源码结构

构造 jQuery 对象的总体源码结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/**
* 自调用匿名函数
* */
(function(window, undefined) {
// 构造 jQuery
var jQuery = (function() {
var jQuery = function(selector, context) {
/**
* 返回 jQuery.fn.init 的实例
*/
return new jQuery.fn.init(selector, context, rootjQuery);
};

// ... 定义一堆变量


/**
* 覆盖构造函数 jQuery() 的原型对象
*/
jQuery.fn = jQuery.protottype = {
/**
* 覆盖原型对象的属性 constructor
*/
constructor: jQuery,
/**
* 定义原型方法 负责解析 selector 和 context 的类型并执行相应的查找
*/
init: function(selector, context, rootjQuery) {
// ... 一堆原型属性和方法
}
};

/**
* 用 jQuery 构造函数的原型对象 jQuery.fn 覆盖 jQuery.fn.init() 的原型对象
*/
jQuery.fn.init.prototype = jQuery.fn;

/**
* 合并两个或多个对象的属性到第一个对象
*/
jQuery.extend = jQuery.fn.extend = function() { ... }

/**
* 执行 jQuery.extend() 在jQuery构造器上定义了一堆静态属性和方法
*/
jQuery.extend({
// 一堆静态属性和方法
})

/**
* 返回 jQuery 构造函数并赋值给外层变量 jQuery
*/
return jQuery;
})();

/**
* 把 jQuery 、 $ 暴露给全局作用域 window
*/
window.$ = window.jQuery = jQuery;
})(window);

为什么要在构造函数 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 对象带有太多的属性和方法而担心会占用太多的内存。

请作者喝杯咖啡