当我们使用$()时到底发生了什么

当我们使用$()时到底发生了什么

1.$是jQuery的别名,$()和jQuery是等价的

 window.jQuery = window.$ = jQuery;

2.jQuery构造函数

    // Define a local copy of jQuery
    jQuery = function( selector, context ) {

    // The jQuery object is actually just the init constructor 'enhanced'
    // Need init if jQuery is called (just allow error to be thrown if not included)
    return new jQuery.fn.init( selector, context );
},

在javascript中,构造函数如果有返回值时,运算符 new所创建的对象会被丢弃,返回值将作为new表达式的值,jQuery利用了这一特性,通过在构造函数jQuery()内部用运算符new创建并返回另一个构造函数的实例,省去了构造函数jQuery()前面的new,即我们创建jQuery对象时可以省略new,直接写jQuery()。

3.jQuery.fn和jQuery.prototype 是等价的

 jQuery.fn = jQuery.prototype

4.既然jQuery()构造函数返回的是jQuery.fn.init()构造函数产生的实例,那么代码中所有挂载在jQuery.fn上的函数,jQuery()创建的实例是不能调用的。因为jQuery(),jQuery.fn.init()两个构造函数的原型不一样产生的实例也是不同的,jQuery是通过下面的代码解决的。

// Give the init function the jQuery prototype for later instantiation
init = jQuery.fn.init = function( selector, context, root ) {
    
    
}
init.prototype = jQuery.fn;

5.当我们使用$()时就是返回了一个 以jQuery.fn.init( selector, context )为构造函数的对象,这个对象的原型是jQuery.

模仿这个过程的小例子

    <script type="text/javascript">
        var Q=function(){
            return new Q.fn.init();
        }

        Q.fn=Q.prototype;
        Q.fn.init=function(){
            return this;
        }
        Q.sayhi=function(){
            console.log('hi');
        }
        Q.fn.sayHello=function(){
            console.log('hello');
        }
        Q.fn.init.prototype=Q.prototype;//如果去掉这一行 下面的qq.sayHello() 无法执行
        Q.sayhi();
        

        var qq =  Q();
        console.log(qq);
        qq.sayHello();

    </script>

参考资料

1.jQuery技术内幕:深入解析jQuery架构设计与原理实现 -- 高云
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,413评论 2 17
  • 在线阅读 http://interview.poetries.top[http://interview.poetr...
    前端进阶之旅阅读 115,353评论 24 450
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 4,937评论 0 1
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 5,281评论 0 2
  • 写意荷花 工笔荷花
    MOSES_4960阅读 1,463评论 0 0

友情链接更多精彩内容