手書きJQueryのフレームワークの実現

10058 ワード

JQueryのメリット
  • クイックハンド(学習コストが低い)
  • 開発効率が高い(セレクタ、一括操作DOM、チェーン型操作…)
  • 一連のパッケージ(アニメーション、ajax)
  • ブラウザ互換(1.xバージョン互換IE 6、7、8)
  • JQuery 1.11.3.js(1.xクラシックバージョン)
  • 性能が悪い(ソースファイルがやや大きい)
  • JQuery 2.2.4(2.xクラシックバージョン)
  • 性能がやや良い(ソースファイルがやや小さい)
  • HTML 5の実装ではない
  • 2.xバージョンは1.xバージョンでは、APIは下向きに互換性があります
  • div.animate({left: 200}, 1000)バージョン2.2.4以降のコンパイルではエラーは報告されませんが、アニメーション効果はありません(すなわち、APIが下に互換性があります)
  • 2.xバージョン比1.xバージョンのパフォーマンスは
  • IE 8および以下のバージョンではHTML 5はサポートされていないため、2.xバージョン放棄互換

  • 自分のjQueryを実現
    ステップ1:分析
    this is span
    
    this is first div
    this is second div
    //      :                  ?
    $(".my-div")
    //          ,          ?
    $(".my-div").css("color","red")
    $(".my-div").html("--------------")
    //   
    //               
            //  ID      
    document.getElementById()
            //                 
            .getElementsByTagName()
            //  name           
            .getElementsByName()
            //   selector               (  、  、HTML5  )
            .querySelectorAll()
    // mineJQuery
    var $ = function(selector){
        // $         
        return document.querySelectorAll(selector)
        // return      [div.my-div, div.my-div]
        //         , .css         ?
        
        //        for   ,       。
        for (var i = 0; i < $(".my-div").length; i++) {
            $(".my-div")[i].style.color = "red";
        }
        //           jQuery         
    }

    ステップ2:コンストラクタ関数と一般関数およびプロトタイプ(forサイクルが多すぎて効率が低下)
        //           new         (             )
        //             Proxy
        //           function
        var Proxy = function(selector){
            // this      ?       ,     !
            //         dom       this.doms 
            this.doms = document.querySelectorAll(selector)
        };
        //     
        Proxy.prototype = {
            css: function(style, value){
                for(var i = 0;i < this.doms.length;i++){
                    this.doms[i].style[style] = value;
                }
                //             ?     。
                
                //       ,            Proxy.prototype   (          a.b.c.d)
                return this;
            },
            html:function(html){
                for(var i = 0;i < this.doms.length;i++){
                    this.doms[i].innerHTML = html;
                }
                return this;
            }
        };
        //       
        // new                   ,      (Proxy)   ,       prototype    
        var p = new Proxy();
        
        var $ = function(selector){
            return new Proxy(selector);
        }
        
        //          ,   !
        //        ,              for         ,        ?
        //PS.----------------------------------------
        //     
        //            function(               ,     )
        //                 (      )
        var func = function(){
            var a;
            var b = 10;
            a = 20;
        }
        //     
        func();

    スタック(最小)
    ヒープ(最大)
    プール
    Proxy
    function(コンストラクタ関数)
    0-9、a-z、A-Z、各種記号
    X(なし)
    function(一般関数)
    ステップ3:改善
  • プログラミングの最も基本的な考え方:コード多重
  •      Proxy.prototype = {
            //   :          ,     each,         
            each: function(callback){
                for(var i = 0;i < this.doms.length;i++){
                    // call  :    Proxy  
                    // i => index, this.doms[i] => object
                    callback.call(this, i, this.doms[i]);
                }
            },
            css: function(style, value){
                this.each(function(index, object){
                     object.style[style] = value;
                    })
                //       ,            Proxy.prototype   (          a.b.c.d)
                return this;
            },
            html:function(html){
                 this.each(function(index, object){
                     object.innerHTML = html;
                    })
                return this;
            }
        };
        
        //   :         js    ,var Proxy = function(){}
        //        jQuery     
        
        //   :     jQuery  Proxy       
        //          ?

    ステップ4:継続的な改善
        //     
    var $ = jQuery = (function(){
         var Proxy = function(selector){
            this.doms = document.querySelectorAll(selector)
         };
          Proxy.prototype = {
            //   :          ,     each,         
            each: function(callback){
                for(var i = 0;i < this.doms.length;i++){
                // call  :    Proxy  
                    callback.call(this, i, this.doms[i]);
                }
            },
            css: function(style, value){
                this.each(function(index, object){
                     object.style[style] = value;
                    })
                //       ,mu'di'shi            Proxy.prototype   (          a.b.c.d)
                return this;
            },
            html:function(html){
                 this.each(function(index, object){
                     object.innerHTML = html;
                    })
                return this;
            }
        };
        // return       
        return function(selector){
            return new Proxy(selector);
        }
    })();
    //               ?
    //        :console.log($(..)) ==> Proxy {doms: NodeList[..]}     ,         ,    jQuery    。
    //        ?
    // $(..).length         ,       jQuery     ,       。
    //        ?

    ステップ5:継続的な改善
    //          Proxy        length     
        var Proxy = function(selector){
            this.doms = document.querySelectorAll(selector);
            this.length = this.doms.length;
        };
    //           ,      ,          。
    
    
    //     ,jQuery          ,              length   ,        ,                  ,       。
    //             
    var $ = JQuery = (function(){
        //       
        function markArray(selector) {
            var arr = document.querySelectorAll(selector);
            return arr;
            //               ,            ,         jQuery           ?
        }
        return function(selector) {
            return markArray(selector);
        }
    })()
    

    そうですか.何か足りないものがあるのか.
    var $ = JQuery = (function(){
        //       
        function markArray(selector) {
            var arr = document.querySelectorAll(selector);
            // console.log(arr.constructor)      
            
            
            //   native code    native code     ?
            //                 ,                 C     ,   java    JNI        C   
            
            //      ,           NodeList ,       
            //          NodeList.prototype.html = function(html){alert(html)}
            //      arr            ,         !
            //   ,                
            return arr;
        }
        NodeList.prototype.each = function(callback) {
            //           this.length,     ?
            for (var i = 0; i < this.length; i++) {
                callback.call(this, i ,this[i])
            }
        }
        NodeList.prototype.html = function(html) {
                this.each(function(index, object) {
                    object.innerHTML = html;
                })
        }
        return function(selector) {
            return markArray(selector);
        }
    })()
    
    //       ,    ,        ,          ,    
    //            ,          !
    var $ = JQuery = (function(){
        //       
        function markArray(selector) {
            var arr = document.querySelectorAll(selector);
            return arr;
        }
        NodeList.prototype = {
            each: function(callback) { 
                for (var i = 0; i < this.length; i++) {
                    callback.call(this, i ,this[i])
                }
            },
            html: function(callback) {
                this.each(function(index, object) {
                    object.innerHTML = html;
                })
            }
        }
        return function(selector) {
            return markArray(selector);
        }
    })()
    
    //       ,           ,        NodeList     native code ,native code            ,              NodeList    ,      。
    //         ?

    注意してください.次の書き方はあなたの観点を覆す可能性があります.
    //                  
    var $ = JQuery = (function(){
        function markArray(selector) {
            var arr = document.querySelectorAll(selector);
            return arr;
        }
        //    :        
        var $ = function (selector) {
            return markArray(selector)
        }
        //       
        $.extend = function(target) {
            //        ?
            //        for   
            //      1  ?
            //             arguments   , arguments         ,           ,  NodeList      ,           
            for (var i = 1; i < arguments.length; i++) {
                //             
                for(var prop in arguments[i]) {
                    //           
                    target[prop] = arguments[i][prop]
                }
            }
            // ruturn   $.fn
            return target;
        }
        //    :   NodeList     ,                  ,          
        //     ,         ,           ,             ,        ,     
        //    (target,exd1,exd2,exd3)  exd1,exd2,exd3       target
        //   target return      ,      target        NodeList
        // $.fn        
        $.fn = $.extend(NodeList.prototype, {
            each: function(callback) { 
                for (var i = 0; i < this.length; i++) {
                    callback.call(this, i ,this[i])
                }
                //          ,        return this,        each     return     ,              return   
                return this;
            },
            html: function(callback) {
                return this.each(function(index, object) {
                    object.innerHTML = html;
                })
            }
        })
        return $;
    })()
    // jQuery         ,    $.fn      jQuery    ,       jQuery
    //    jQuery                 :
    $.fn.altr = function(){
        alert(1);
    }
    $(".my-div").altr();
    //        ,           ,               ?
    //      $.fn     NodeList.prototype    ,           。
    //           console.log($.fn === NodeList.prototype)
    //   $(function(){})   ,           ,    
    var $ = function (selector) {
        if (typeof selector === "function") {
            window.onload = selector
        } else {
            return markArray(selector);
        }
    
    }