javascript - 一个关于jquery源码的问题: jQuery.fn.init.prototype = jQuery.fn
巴扎黑
巴扎黑 2017-04-11 11:49:39
[JavaScript讨论组]
 var jQuery = (function() {
       var jQuery = function( selector, context ) {
           return new jQuery.fn.init( selector, context, rootjQuery );
       }

       // jQuery对象原型
       jQuery.fn = jQuery.prototype = {
           constructor: jQuery,
           init: function( selector, context, rootjQuery ) {
              //do something

           }

       };
       jQuery.fn.init.prototype = jQuery.fn;

jquery源码中,通过jQuery.fn.init.prototype = jQuery.fn;这一句将jQuery.prototype的方法挂载到new出来的新的jquery对象上,但是当我使用

jQuery.extend({
  sayhello:function(){
      console.log("Hello,This is jQuery Library");
    }
})

extend来定义一个新方法时,这个方法按理来说应该是
1.既绑定到了jQuery.prototype上 原因:jQuery.extend = jQuery.fn.extend=function(){}
2.也绑定到了new出来的新jquery对象上,原因:jQuery.fn.init.prototype = jQuery.fn

但是!这种情况下我$("p").sayhello()却报错Uncaught TypeError: $(...).sayhello is not a function(…)
$.sayhello();却可以成功Hello,This is jQuery Library
很显然这个sayhello成为了jquery原型的方法,但是并没有挂载到new出来的新的jquery对象上
请问这种情况应该怎么理解呢?

巴扎黑
巴扎黑

全部回复(4)
天蓬老师

jQuery.extend = jQuery.fn.extend=function(){}这一句只是表明 jQuery 和 jQuery的原型都指定了同一个继承方法,并不代表你调用了jQuery.extend同时调用了jQuery.fn.extend

你用的jQuery.extend只是继承到了jQuery这个全局函数上,只能$.sayhello();调用。

迷茫

好复杂的样子

伊谢尔伦

这里并不是赋值,而是两者指向同一个对象扩展函数

巴扎黑

jQuery.fn.extend({

sayhello:function(){
  console.log("Hello,This is jQuery Library");
}

})就行了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号