• jQuery源码学习


    1 无new构建

    jQuery使用的的方式是$(obj).html().attr();或者是jQuery(obj).html().attr()

    形式上是$() 或者jQuery()

    先看js函数的实现方式

    var Jackey = function(){
        //构造函数
        };
    Jackey.prototype={
        //原型
        name:function(){
            console.log("Jackey");
            },
        age:20
        };
    //使用方式
    var jackey = new Jackey();
    jackey.name();  //Jackey

    但是要怎样才可以省略new呢?怎样才可以实现Jackey().name()呢?

    我们修改一下,让构造函数返回原型

    var Jackey = function(){
        //构造函数
        return Jackey.prototype;
        };
    Jackey.prototype={
        //原型
        name:function(){
            console.log("Jackey");
            },
        age:20
        };
    //使用方式
    //var jackey = new Jackey();
    Jackey().name();//Jackey 成功

    再修改一下

    var $ = Jackey = function(){
        //构造函数
        return Jackey.prototype;
        };
    $.fn = Jackey.prototype={
        //原型
        name:function(){
            console.log(this.age);
            },
        age:20
        };
    //使用方式
    //var jackey = new Jackey();
    $().name();//和jQuery的使用方式就差不多了,但是这是jquery的写法?答案是:不是

    我们再来试试这样的写法

    var $ = Jackey = function(){
        //构造函数
        return Jackey.prototype.init();
        };
    $.fn = Jackey.prototype={
        //原型
        init:function(){
                return this;
            },
        name:function(){
            console.log(this.age);
            },
        age:20
        };
    //使用方式
    //var jackey = new Jackey();
    $().name();//20 

    这样的写法,构造函数返回原型的init,指向的是原型的作用域,返回的是Jackey()的实例,但是this指向的作用域问题就有点混淆了。

    var $ = Jackey = function(){
        //构造函数
        return Jackey.prototype.init();
        };
    $.fn = Jackey.prototype={
        //原型
        init:function(){
            this.age = 22;
                return this;
            },
        name:function(){
            console.log(this.age);
            },
        age:20
        };
    //使用方式
    //var jackey = new Jackey();
    $().name();    //22 我们原本想输出20的,结果输出了22.是因为init()返回的是init()作用域里面的age,如果注释掉init里面的age,则会返回20.

    这样就不是很符合我们当初的预想了。再改改

    分隔作用域

    var $ = Jackey = function(){
        //构造函数
        return new Jackey.prototype.init();
        };
    $.fn = Jackey.prototype={
        //原型
        init:function(){
                return this;
            },
        name:function(){
            console.log(this.age);
            },
        age:20
        };
        Jackey.prototype.init.prototype = Jackey.prototype;
    //使用方式
    //var jackey = new Jackey();
    $().name();//20
  • 相关阅读:
    解决ubuntu下pip安装报错问题:ERROR: Cannot uninstall 'XXXXXXX'. It is a distutils installed project...
    【IMU】【卡尔曼滤波】惯性导航误差微分方程与状态转移方程
    AspNetCore 路由 <3.0>
    AspNetCore 认证 <1.0>
    AspNetCore 鉴权 <2.0>
    apollo学习2:docker集群部署
    C#中HashSet<T>、SortedSet<T>和Hashtable的使用以及所有集合类型的概述
    Spring自带的Objects等工具类(减少繁琐代码)
    五分钟,手撸一个简单的Spring容器
    jdk1.8: Consumer函数
  • 原文地址:https://www.cnblogs.com/lihaozhou/p/3624079.html
Copyright © 2020-2023  润新知