• 分离构造器(2-2)


    分离构造器(2-2)(慕课网)

    通过new操作符构建一个对象,一般经过四步:

      A.创建一个新对象

      B.将构造函数的作用域赋给新对象(所以this就指向了这个新对象)

      C.执行构造函数中的代码

      D.返回这个新对象

    最后一点就说明了,我们只要返回一个新对象即可。其实new操作符主要是把原型链跟实例的this关联起来,这才是最关键的一点,所以我们如果需要原型链就必须要new操作符来进行处理。否则this则变成window对象了。

    我们来剖析下jQuery的这个结构,以下是我们常见的类式写法:

    var $$ = ajQuery = function(selector) {
        this.selector = selector;
        return this
    }
    ajQuery.fn = ajQuery.prototype = {
        selectorName:function(){
            return this.selector;
        },
        constructor: ajQuery
    }
    var a = new $$('aaa');  //实例化
    a.selectorName() //aaa //得到选择器名字

    首先改造jQuery无new的格式,我们可以通过instanceof判断this是否为当前实例:

    var $$ = ajQuery = function(selector) {
        if(!(this instanceof ajQuery)){
            return new ajQuery(selector);
        }
        this.selector = selector;
        return this
    }

    但是注意千万不要像下面这样写:

    var $$ = ajQuery = function(selector) {
        this.selector = selector;
        return new ajQuery(selector);
    }
    Uncaught RangeError: Maximum call stack size exceeded

    这样会无限递归自己,从而造成死循环并且溢出。

    jQuery为了避免出现这种死循环的问题,采取的手段是把原型上的一个init方法作为构造器

    var $$ = ajQuery = function(selector) {
        //把原型上的init作为构造器
        return new ajQuery.fn.init( selector );
    }
    
    ajQuery.fn = ajQuery.prototype = {
        name: 'aaron',
        init: function() {
            console.log(this)
        },
        constructor: ajQuery
    }

    这样确实解决了循环递归的问题,但是又问题来了,init是ajQuery原型上作为构造器的一个方法,那么其this就不是ajQuery了,所以this就完全引用不到ajQuery的原型了,所以这里通过new把init方法与ajQuery给分离成2个独立的构造器。

    慌慌张张 匆匆忙忙 为何生活总是这样 难道说我的理想 就是这样度过一生的时光 不卑不亢 不慌不忙 也许生活应该这样 难道说六十岁以后 再去寻找我想要的自由 其实我也常对自己说 人要学会知足而常乐 可万事都一笑而过 还有什么意思呢
  • 相关阅读:
    Linux中磁盘mbr分区——实践篇
    Linux中磁盘分区——理论篇
    Linux中常用压缩打包工具
    自动化(脚本)安装httpd服务
    CentOS6.8环境下搭建yum网络仓库
    CentOS下rpm命令详解
    CentOS下yum命令详解
    CentOS7.3环境下源码安装httpd
    js对url进行编码和解码(三种方式区别)
    前端paging分页,前端设置每页多少条和当前页面的索引,传给后端,数据显示出来
  • 原文地址:https://www.cnblogs.com/siwy/p/4870632.html
Copyright © 2020-2023  润新知