• jquery无new构建学习笔记


      当我们想要创建一个对象,我们可能使用new方法去构建一个对象,那按道理jquery也是一个对象,应该也是用new jquery()来构建呀为什么我们创建jquery对象不用new jquery()而是直接使用类似$(ele)的方式去构建出来一个jquery对象呢?其实内部还是使用了new来构建的,只是jquery内部帮我们构建了而已,请看下面代码

      function Jquery(selector, context) {
            return new Jquery(selector, context);
        }
    
        Jquery.prototype = {
            version:'1.01'
        }

      直接这样内部使用new来构建Jquery,很明显是有问题的,这样的话就形成了死循环。为了解决死循环的问题,请看下面代码:

    function Jquery(selector, context) {
        return Jquery.prototype.init(selector, context);
    }
    
    Jquery.prototype = {
        version:'1.01',
        init: function () {
            this.name = "lin";
            return this;
        }
    }
    
    var a = Jquery();
    var b = Jquery();
    console.log(a.version); //1.01
    console.log(a.name);   //lin
    a.name = "na";
    console.log(b.name);  //na

      死循环的问题确实解决了,但是又发现了新的问题,可以看到a和b两个对象的属性是公用的,我修改a.name属性为na,b.name属性也跟着变为了na,其原因就是this都是指向Jquery的

      为了解决这个问题,我们可以每次调用Jquery()的时候都构建一个新的对象,改进代码如下:

    function Jquery(selector, context) {
        return new Jquery.prototype.init(selector, context); //注意看,这里多了个new
    }
    
    Jquery.prototype = {
        version:'1.01',
        init: function () {
            this.name = "lin";
            console.log(this);
            return this;
        }
    }
    
    var a = Jquery();
    var b = Jquery();
    console.log(a.version); //undefined
    console.log(a.name);   //lin
    a.name = "na";
    console.log(b.name);  //na

      这样处理之后,属性共享的问题已经解决了,每个对象都有各自的属性,可以自由修改,每个对象互不影响,但是又又又发现了新的问题,可以看到我们控制台打印a.version这个属性的时候是读取不到这个属性的,原因就在于此时Jquery.prototype和Jquery.prototype.init.prototype是互不相干的,我们创建的是Jquery.prototype.init对象,所以只能读到Jquery.prototype.init.prototype上的属性而读取不到Jquery.prototype上的属性的(该例指version这个属性),解决办法很简单,就是把Jquery.prototype赋值给Jquery.prototype.init.prototype,这样就相当于把Jquery原型上的属性全部赋值到了Jquery.init的原型上,请看下面代码:

    function Jquery(selector, context) {
        return new Jquery.prototype.init(selector, context);
    }
    
    Jquery.prototype = {
        version:'1.01',
        init: function () {
            this.name = "lin";
            return this;
        }
    }
    
    Jquery.prototype.init.prototype = Jquery.prototype;  //画龙点睛之笔
    
    var a = Jquery();
    var b = Jquery();
    console.log(a.version); //1.01
    console.log(a.name);   //lin
    a.name = "na";
    console.log(b.name);  //na

      可以看到,我们控制台打印a对象的version属性,已经可以读取并且打印出来了。

      至此,已经完成了Jquery的无new构建。

    ps:jQuery.fn其实就是jQuery的prototype,jquery源码可以看到该条语句:jQuery.fn = jQuery.prototype = {};

      $()和jquery()其实是一样的,jquery源码可以看到该条语句: window.jQuery = window.$ = jQuery;

  • 相关阅读:
    博客是一种心情
    双显示器和双鼠标
    C++ Primer Plus 第六版 代码笔记
    Bug,昂首走进2005
    让万能五笔2004免费版改首页的功能见鬼去吧。
    Gmail提供POP3和SMTP已经老长时间了
    快过年回家了,发点实用的东西给大家
    关于博客园Post的时候排版的一点小建议
    在.Net下进行MicroStation(GG)的开发(一)
    验证域的另一方法
  • 原文地址:https://www.cnblogs.com/yonglin/p/7995555.html
Copyright © 2020-2023  润新知