jQuery内部实例化过程分析

jQuery的所有代码放在了自调用的匿名函数中,防止命名污染

(function( window, undefined ) {
      ------
})( window );

我们在使用$("div")获取Dom元素,看起来就像是调了一个普通的函数,每次调用jQuery就会实例化一个对象

一般访问构造函数中的方法是这样操作,代码如下:

function jQuery(selector) {
      this.html= function () {
          console.log("我是绿豆糕");
      }
  }
  new jQuery("div").html();

上边代码每次访问方法都要new一下,而我们看到的jQuery是这样的方式调用的jQuery("div").html(),怎么才能达到这样的效果呢? 想一想....

应该是jQuery内部帮我们实现了,调用jQuery函数的时候,返回值就应该是一个实例对象

function jQuery(selector) {
       this.html= function () {
          console.log("我是绿豆糕");
      }
      return new jQuery(selector);
  }
  jQuery("div").html();

这样做思路没有问题,让我们愉快的运行一下

Paste_Image.png

糟糕.....整成堆栈溢出了,原因是new jQuery(),出现自己调用自己,发生递归却没有结束条件,这可咋整

其实这个问题jQuery内部的实现方式却相当高明

//闭包环境,防止与外部命名污染
    (function (window, undefined) {
        var jQuery = function (selector) {
            //返回init构造函数的实例
            return new jQuery.prototype.init(selector);
        }
        jQuery.prototype = {
            constructor: jQuery,
            init: function (selector) {

            },
            html: function () {
                console.log("我是绿豆糕");
            }
        }
        //init的原型指向jQuery的原型,这样我们就能访问jQuery原型中的方法了
        jQuery.prototype.init.prototype = jQuery.prototype;
        jQuery("div").html();
        //导出接口,外部就可以访问了,这也是为什么我们用$("div")也能得到Dom元素
        window.jQuery = window.$ = jQuery;
    })(window)

调用jQuery函数返回的是return new jQuery.prototype.init(selector),但是为什么html方法不在init构造函数内部也能调用成功,打印出"我是绿豆糕"呢?

原因是执行了这行代码

  jQuery.prototype.init.prototype = jQuery.prototype;

init里面的this,受制于作用域的限制,访问不到jQuery.prototype其它的属性
jQuery内部的一句'jQuery.fn.init.prototype=jQuery.fn'
将init的原型指向了jQuery的原型,这样一来,jQuery产生的实例对象就能够访问jQuery原型上的属性了
jQuery的原型中有html方法,这样init的实例也能访问了,因为原型继承

源码中jQuery.fn是啥? 实际上就是jQuery.prototype

jQuery.fn = jQuery.prototype = {
    ......
}
jQuery.fn.init.prototype = jQuery.fn;
等效于我们刚才分析的这句
 jQuery.prototype.init.prototype = jQuery.prototype;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,752评论 2 17
  • 在线阅读 http://interview.poetries.top[http://interview.poetr...
    程序员poetry阅读 114,368评论 24 450
  • 1、应用卡顿的原理,以及针对界面切换卡顿和屏幕滑动卡顿提出典型的解决思路 卡顿原理: 1)大多数手机的屏幕刷新频率...
    Jimmy5Zhang阅读 366评论 0 5
  • 游记 今天我和往常一样早早就起来了,但今天不同的是我休班,我要带着老婆和孩子出去旅游...
    夏俊智爸爸阅读 307评论 0 1
  • 阅读有主题阅读,游走当然有主题游走。随心所欲飘飘荡荡的固然美妙,但是这个可能更适合一个纯然陌生的地方。在熟悉的城市...
    简彤阅读 240评论 0 0