简述jq的实现原理
1. 沙箱:
- jq利用自执行函数,将所有的实现细节封装在自执行函数内,对外仅仅暴露jQuery和$符号:
(function(w, u) {
"use strict";
w.jQuery = w.$ = jQuery;
var a;
if (a == u)
return;
})(window);
2. 无new化
- 在jq中我们使用选择器,是直接使用$(selector)的,但是其实他返回的是一个jq对象,其中挂载了很多jq方法。
(function(window, undefined){
jQuery = function(selector, context){
return new jQuery.fn.init(selector, context);
},
jQuery.fn = jQuery.prototype = {
init: function(selector, context, rootjQuery){
// ...
}
},
jQuery.fn.init.prototype = jQuery.fn;
})(window);
当我们传入一个选择器时,会返回new jQuery.fn.init(selector, context);而当我们传入空选择器时,在init中会显示返回this,此时this是指带init,而init的prototype被赋值为jQuery.fn,因此就相当于jQuery的实例。
- jQuery.fn.init.prototype = jQuery.fn = jQuery.prototype
- new jQuery.fn.init() 相当于 new jQuery() ;
3. jq链式调用原理
- 每次函数执行完的时候都会返回this,jq对象本身
4. $.extend与$.fn.extend区别
- .extend是扩展一个类对象的方法,通常是用来拓展全局函数,例如.extend是扩展一个类对象的方法,通常是用来拓展全局函数,例如.extend是扩展一个类对象的方法,通常是用来拓展全局函数,例如.ajax,$.jsonParse等方法。
- $.fn.extend是扩展原型链里的方法,是给具体的实例对象来调用。
5. $.extend()深浅复制
- 浅复制:简单的同名数据覆盖。
- 深复制:比较非简单类型数据内部的数据,相同覆盖,不同添加