zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    java 三目运算符
    增强for 可以用于ArrayList
    shell SORT
    BASH if/while/until loop
    设置临时环境变量
    2015年创业中遇到的技术问题:121-130
    2015年创业中遇到的技术问题:121-130
    JDK8新特性之Lambda表达式
    使用Html5开发Android和iOS应用:HBuilder、Html5Plus、MUI
    使用Html5开发Android和iOS应用:HBuilder、Html5Plus、MUI
  • 原文地址:https://www.cnblogs.com/jokes/p/10477049.html
Copyright © 2011-2022 走看看