zoukankan      html  css  js  c++  java
  • jQuery源码笔记——二

    jQuery选择这样返回对象

    var jQuery = function( selector, context ) {
            return new jQuery.fn.init( selector, context );//从jQuery.fn里调用的方法
    };
    jQuery.fn = jQuery.prototype = { //这里jQuery.prototype,目前在这段代码中没用 。
        init: function(){
            console.log("初始化完成");
            return this;
        }
      //功能方法 } jQuery.fn.init.prototype
    = jQuery.fn //让所有实例化jQuery.fn.init都继承这个原型中的方法。 console.log(jQuery());//{...}

    这里有一个重要的知识点,new 到底做了什么:new 构造函数jQuery.fn.init,将返回一个对象,这个对象会继承构造函数的原型jQuery.fn.init.prototype,而这个原型被我所们改写,指向jQuery.fn,也就是一个对象,对象里拥有init和所有的功能方法。这就实现了我们想返回一个拥有所有功能方法的对象。

    我们也可以这样

    var jquery = function(){
        if(!(this instanceof jquery)) return new jquery();
        console.log("初始化完成");
    }
    jquery.fn = jquery.prototype = {
        //功能方法
    }
    console.log(jQuery());//{...}

    其实,根本要解决的问题是返回一个对象,这个对象默认要拥有功能方法。为了最大效率,两个例子都选择不把功能方法写在对象里,而是通过对原型的改写,让实例化默认继承。

    链式调用

    var jQuery = function( selector, context ) {
            return new jQuery.fn.init( selector, context );
    };
    jQuery.fn = jQuery.prototype = {
        init: function(){
            console.log("初始化完成");
            return this;
        },
        add:function(){
            console.log("add完成")
            return this;
        }
    }
    jQuery.fn.init.prototype = jQuery.fn
    console.log(jQuery().add().add());

    javascript中,函数中的this指向调用它的对象。本例,jQuery()实例化了一个对象,这个对象调用了add()方法,输出add,然后返回this,这个this实际就是调用它的对象jQuery(),因此无论执行了多少方法,只要返回this,那之前的结果都是最初的对象,都可以继续使用最初这个对象里功能方法。

    向对象里添加方法的函数

    var object = {
        name: "winderby"
    }
    object.extend = function(obj){
        for (var key in obj)
            this[key] = obj[key];
        return this;
    }
    object.extend({
        getName:function(){
            console.log(this.name);
        }
    })
    object.getName();

    合并对象

    function extend() {
        for (var i = 1; i < arguments.length;i++){
            for(var key in arguments[i]){
                arguments[0][key] = arguments[i][key]
            }
        }
    }
    var student = {
        name:"winderby",
        age: "18"
    }
    var arrangement = {
        name:"winderby",
        lesson:"english"
    }
    extend(student,arrangement);
    console.log(student)

    jQuery的extend

    var jQuery = function( selector, context ) {
            return new jQuery.fn.init( selector, context );
    };
    jQuery.fn = jQuery.prototype = {
        init: function(){
            return this;
        }
    }
    jQuery.fn.init.prototype = jQuery.fn
    jQuery.fn.extend = jQuery.extend = function(){//指向同一个方法
        var i = 1;
        var target = arguments[0];
        var length = arguments.length;
        if(length === 1){ //1个参数时
            target = this;
            i--;
        }
        for (; i < arguments.length;i++){ //主要功能体,遍历,赋值
            for(var key in arguments[i]){
                target[key] = arguments[i][key]
            }
        }
    }
    
    //jQuery.extend合并对象测试
    var student = {
        name:"winderby",
        age: "18"
    }
    var arrangement = {
        name:"winderby",
        lesson:"english"
    }
    jQuery.extend(student,arrangement);
    console.log(student);
    
    //jQuery.fn.extend添加jQuery方法测试
    jQuery.fn.extend({
        setName: function(myName) {
            this.myName = myName
            return this;
        },
        getName: function() {
            console.log(this.myName)
            return this;
        }
    })
    jQuery().setName("winderby").getName();

    将前面两个功能合并到一个jQuery函数里就成了jQuery的extend。目前这个extend可以通过jQuery.extend合并对象,也可以通过jQuery.fn.extend,向jQuery.fn添加方法。

    至于第三种用法jQuery(true,{..}),也很简单,就不赘述了。

  • 相关阅读:
    微信公众号开发(一)——环境搭建
    Spring中@Async-异步处理
    SSL/TLS安全评估-查看访问的网址支持哪些协议等
    SSL异常javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
    Java代码自动部署
    SQL优化技巧
    idea2019.2 svn 忽略文件问题
    Remote System Explorer Operation在eclipse后台一直跑 解决办法
    JPA project Change Event Handler问题解决
    MySQL按首字母查询
  • 原文地址:https://www.cnblogs.com/winderby/p/4078594.html
Copyright © 2011-2022 走看看