Skip to content

Commit cd6a752

Browse files
committed
jQuery设计思路和extend方法实现
1 parent deb6305 commit cd6a752

File tree

2 files changed

+196
-0
lines changed

2 files changed

+196
-0
lines changed

image/2019-09-02092202.png

496 KB
Loading
+196
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
# jQuery设计思路
2+
3+
### jQuery 无new构建示例
4+
$就是jQuery的别称;
5+
````javascript
6+
(function(root){
7+
var jQuery =function(){
8+
9+
}
10+
root.$ = root.jQuery = jQuery
11+
})(this)
12+
````
13+
$() 就是在创建jQuery的示例对象
14+
````JavaScript
15+
(function(root){
16+
var jQuery =function(){
17+
return new jQuery()
18+
}
19+
root.$ = root.jQuery = jQuery;
20+
})(this)
21+
````
22+
### 共享原型设计
23+
![GitHub Logo](../image/2019-09-02092202.png )
24+
````JavaScript
25+
(function(root){
26+
var jQuery = function(){
27+
return new jQuery.prototypoe.init()
28+
}
29+
jQuery.fn = jQuery.prototype = {
30+
init:function(){
31+
32+
}
33+
//拓展其他方法
34+
css:function(){
35+
36+
}
37+
}
38+
/共享原型对象
39+
jQuery.fn.init.prototype = jQuery.fn;
40+
root.$ = root.jQuery = jQuery;
41+
})(this)
42+
````
43+
### extend源码解析
44+
#### 应用场景
45+
````javaScript
46+
// 可以给jQuery本身进行拓展 此时的this === jQuery
47+
$.extend({
48+
work:function(){}
49+
})
50+
//执行
51+
jQuery.work()
52+
//也可以给jQuery实例化对象进行拓展 this == jQuery 的实例化对象
53+
$.fn.entend({
54+
sex:
55+
})
56+
$().sex//打印出 男 $.fn.extend === $.extend
57+
58+
//也可以对对象进行拓展
59+
//浅复制
60+
var obj = $.extend({},{name:'max',list:{age:30}})
61+
console.log(obj)//打印出obj对象
62+
//进行深度复制
63+
var ret = {name:"max",list:{age:"30"}};
64+
var res = {list:{sex:""}};
65+
//任意对象扩展
66+
var obj1 = $.extend(true,{}, ret, res); //=> name age
67+
console.log(obj1);
68+
````
69+
####jQuey的源码解析
70+
````javaScript
71+
(function(root){
72+
var jQuery = function(){
73+
return new jQuery.prototype.init()
74+
}
75+
jQuery.fn = jQuery.prototype = {
76+
init:function(){},
77+
css:function(){}
78+
}
79+
// $.fn.extend === $.extend
80+
jQuery.fn.extend = jQuery.extend = function(){
81+
var target = arguments[0]||{};//判断extend方法传入的第一个参数 可能是 true 也可能是传入要拓展的对象
82+
var length = argument.length;//3
83+
var i =1;
84+
var deep = false;
85+
//定义变量
86+
var option,name,copy,src,copyIsArray,clone;
87+
//判断第一个参数 是否是boolean
88+
if (typeof target === "boolean") {
89+
deep = target;
90+
target = arguments[1];//拓展成空对象 {} $.extend(true,{}, ret, res);
91+
i = 2;
92+
}
93+
//如果 参数的个数是1
94+
if(length === i){
95+
target = this//给jQuery拓展属性和方法 target指向jQuery 或者jQuery实例化对象
96+
i--;
97+
}
98+
for(;i<length;i++){
99+
if( (option = ) ){
100+
101+
}
102+
}
103+
//浅拷贝 深拷贝
104+
for (; i < length; i++) {
105+
if ((option = arguments[i]) != null) {
106+
for (name in option) {
107+
copy = option[name];
108+
src = target[name];
109+
if(deep && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))){
110+
if(copyIsArray){
111+
copyIsArray = false;
112+
clone = src && jQuery.isArray(src) ? src : [];
113+
} else {
114+
clone = src && jQuery.isPlainObject(src) ? src : {};
115+
}
116+
target[name] = jQuery.extend(deep, clone, copy);
117+
} else if(copy != undefined){
118+
target[name] = copy;
119+
}
120+
}
121+
}
122+
}
123+
return target;
124+
}
125+
//共享原型对象
126+
jQuery.fn.init.prototype = jQuery.fn;
127+
//给jQuery拓展类型的检测
128+
jQuery.extend({
129+
//类型检测
130+
isPlainObject: function(obj){
131+
return toString.call(obj) === "[object Object]";
132+
},
133+
isArray: function(obj){
134+
return toString.call(obj) === "[object Array]";
135+
}
136+
})
137+
root.$ = root.jQuery = jQuery;
138+
})(this)
139+
140+
````
141+
**工作中应用拓展深复制和浅复制的方法 去除传递一个参数的可能 **
142+
143+
````JavaScript
144+
145+
//浅复制
146+
var obj = extend({},{nama:'max',list:{age:30}})
147+
console.log(obj)
148+
//深复制
149+
var obj1 = extend(true,{},{name:'max',list:{age:30}},{list:{address:'北京'}})
150+
151+
//定义一个方法 用于拓展对象或者数组
152+
function extend(){
153+
var target = arguments[0] || {};
154+
var length = arguments.length;
155+
var i = 1;
156+
var deep = false;
157+
var option, name,copy,src,copyIsArray,clone;
158+
if (typeof target === "boolean") {
159+
deep = target;
160+
target = arguments[1];
161+
i = 2;
162+
}
163+
if (typeof target !== "object") {
164+
target = {};
165+
}
166+
167+
//浅拷贝 深拷贝
168+
for (; i < length; i++) {
169+
if ((option = arguments[i]) != null) {
170+
for (name in option) {
171+
copy = option[name];
172+
src = target[name];
173+
if(deep && (isPlainObject(copy) || (copyIsArray = isArray(copy)))){
174+
if(copyIsArray){
175+
copyIsArray = false;
176+
clone = src && isArray(src) ? src : [];
177+
} else {
178+
clone = src && isPlainObject(src) ? src : {};
179+
}
180+
//进行递归
181+
target[name] = extend(deep, clone, copy);
182+
} else if(copy != undefined){
183+
target[name] = copy;
184+
}
185+
}
186+
}
187+
}
188+
return target;
189+
}
190+
function isPlainObject(obj){
191+
return toString.call(obj) === "[object Object]";
192+
}
193+
function isArray(obj){
194+
return toString.call(obj) === "[object Array]";
195+
}
196+
````

0 commit comments

Comments
 (0)