jquery框架封装及解析原理+自己搭建jquery框架+注释



<script>
    //利用自执行函数封装jq代码,避免暴露太多的全局变量
    (function (window) {
        //为了以后能方便借用数组的各种方法,提前存到变量中,全局都是用这一个数组,节约空间
        var arr = [];
        var push = arr.push;
        var splice = arr.splice;
        var slice = arr.slice;
        //模拟jQuery中的Sizzle引擎,利用选择器获取元素
        function Sizzle(seletcor) {
            return document.querySelectorAll(seletcor);
        }
        //定义jq的核心方法
        function jQuery(selector) {
            //创建jq函数原型中的F的实例,因为后面将 init函数(初始化函数)的原型指向了 jq的原型(核心操作),所以所有F的实例都可以
            //访问jq中的方法
            return new jQuery.fn.init(selector);
        }
        //使用原型替换,给jq定义原型,并且把jq原型的索引复制给jQuery.fn,即  jQuery.prototype == jQuery.fn
        jQuery.fn = jQuery.prototype = {
            constructor: jQuery,
            //定义初始化函数
            init: function (selector) {
                //为了把获取到的dom元素,并把获取到的dom元素包装成一个数组,并保存在this                //借用数组的splice方法,清空this最终存储的属性
                splice.call(this,0,this.length);
                //借用数组的push,把获取到的dom元素包装成一个数组,并保存在this                push.apply(this,Sizzle(selector));
                //为了可以使用链式编程,返回调用该方法的对象。
                //解析:一、如果是方法调用模式,this指向调用该方法的对象,return this从而实现链式编程
                //     二、如果是构造函数调用,默认返回thisreturn this和不返回没什么区别。
                return this;
            },
            //模仿jq中的css方法,设置dom的样式
            css: function (styleName, styleValue) {
                for (var i = 0; i < this.length; i++) {
                    var ele = this[i];
                    ele.style[styleName] = styleValue;
                }

                //为了实现链式编程
                return this;
            }
        };
        //jq中的extend方法是jq的非常核心的一个方法,在 jQueryjQuery.prototype中都有这个方法的索引
        //entend方法使用示例:
        /*
        * jquery的原型中添加方法时,利用extend的特性。
        *
        * jQuery.extend({
        *   each:function(){},
        *   type:function(){},
        *   isString:function(){}
        * });
        *
        * jQuery中的工具方法一般加到jQuery
        * jQuery中操作dom的方法一把加到jQuery.prototype
        *
        * */

        /*
        * jq中比较核心的extend方法解析:
        *
        *
        * jQuery.extend();传入一个对象的话,就吧这个对象的属性加到jQuery
        * jQuery.extend();传入多个对象的话,就把第2,3,4等等个对象,依次追加到第一个对象上
        *
        * jQuery.fn.extend():传入一个对象的话,就吧这个对象的属性加到jQuery.fn
        * jQuery.fn.extend():传入多个对象的话,就把第2,3,4等等个对象,依次追加到第一个对象上
        *
        * */
        jQuery.fn.extend = jQuery.extend = function () {
            var target, sources;
            var arg0 = arguments[0];
            if (arg0.length == 0) return this;

            if (arguments.length == 1) {
                target = this;
                sources = [arg0];
            } else {
                target = arg0;
                sources = slice.call(arguments, 1);
            }
            for (var i = 0; i < sources.length; i++) {
                var source = sources[i];
                for (var key in source) {
                    target[key] = source[key];
                }
            }
            return target;
        }
        //核心操作 核心操作 核心操作  让init的原型指向 jquery的原型,这样,任何init的实例,都可以访问
        // jq原型中的所有方法
        jQuery.fn.init.prototype = jQuery.fn;
        //暴露两个全局变量,可以访问 jq中的方法
        window.jQuery = window.$ = jQuery;
    })(window);

</script>




  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITzhongzi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值