jQuery源码框架fn解读

(function( window, undefined ){
        var jQuery = (function(){
            var jQuery = function( selector, context ){
                return new jQuery.fn.init( selector, context )
            }
            
            jQuery.fn = jQuery.prototype = {
                constructor: jQuery,
                init: function( selector, context ){
                    if (!selector) return this;
                    var nodeList = (context || document).querySelectorAll( selector ),
                        i = 0,
                        length = nodeList.length;
                    for (; i<length; i+=1){
                        this[i] = nodeList[i];
                    }
                    this.length = nodeList.length;
                    return this;
                }
            }
            //用fn的真正原因是
            //如果不用fn,直接用jQuery.init 会返回undefined,主要是jQuery并不是new的对象,也就不能//访问原型,undefined不能设置原型
            //jQuery.fn = {}可以直接访问init属性,所以fn必须写
            console.log( jQuery.fn );

            jQuery.fn.init.prototype = jQuery.fn;

            jQuery.fn.extend = jQuery.extend = function(obj){
                    var obj = obj || null;
                    if (!obj) return this;
                    for ( var i in obj){
                        if (!jQuery.fn[i]){
                            jQuery.fn[i] = obj[i];
                        }
                    }
                    return this;
            }

            return jQuery;
        })()
        window.$ = window.jQuery = jQuery;    
    })( window, undefined )

下边是没有使用jQuery.fn的代码,使用了jQuery.fn的框架更简单,不用函数运行就可以对原型添加方法,也就是这一点,

因为直接jQuery.prototype不能直接添加方法,必须声明!但是jQuery.fn就可以,因为他不是原型而是一个{}object

jQuery.fn = jQuery.prototype = {};

<body>

    <h1>标题1</h1>
    <h1>标题2</h1>
    <h1>标题3</h1>
    <script>
        
                
                var jQuery = function( selector, context ){
                    return new jQuery.prototype.init( selector, context );
                }

                jQuery.prototype = {
                    
                    constructor: jQuery,

                    init: function( selector, context ){

                        if ( !selector ) return;
                        var nodeList = ( context || document ).getElementsByTagName( selector ),
                            i = 0,
                            length = nodeList.length;
                        for (; i<length; i+=1){
                            this[i] = nodeList[i]
                        }
                        this.length = nodeList.length;

                        return this
                    }

                }
                
                jQuery.prototype.init.prototype = jQuery.prototype;
                jQuery.prototype.extend = function( obj ){
                    if ( !obj ) return;
                    for ( var i in obj ){
                        if ( !jQuery.prototype[i] ){
                            jQuery.prototype[i] = obj[i]
                        }
                    }
                }


                jQuery.prototype.extend({
                    changeColor: function( color ){
                        if ( !color ) return;
                        var i = 0,
                        length = this.length;
                        for (; i<length; i+=1){
                            this[i].style.color = color;    
                        }
                        return this;
                    }
                });
            jQuery('h1').changeColor('red');
            //标准的写法 jQuery.fn.extend = jQuery.extend 
            //因为非标准的没有jQuery.fn 所以不能jQuery.extend()直接添加,必须jQuery.prototype.extend()
            //进行添加,又因为jQuery.fn = jQuery.prototype = {},所以jQuery.fn是一个对象不用函数调用可以直//接添加
    </script>
 </body>
原文地址:https://www.cnblogs.com/jokes/p/10477049.html