jQuery.fn.init.prototype = jQuery.fn;这样写好绕
发布于 10 年前 作者 yakczh 11367 次浏览 最后一次编辑是 8 年前

jQuery.fn 为一个对象的话 对象的其中一个方法的原型 是对象自己 而且new jQuery对象为什么非要套在 jQuery.prototype里面其中的一个方法init上来做构造,用个其他的函数是不是更清晰些 ?


         function F(selector, context, rootjQuery){
         return this;
         }
        F.prototype={
             each:function(){
            },
     ....
     

           }
            
        };
       var jQuery = function( selector, context ) {
         // return new jQuery.fn.init( selector, context, rootjQuery );
           return new F( selector, context, rootjQuery );
       }

这样是不是更清晰一些?

7 回复

(1) $.fn 提供扩展插件 (2)namespace

F需要一个命名空间来放置,如果你放到windows上,则有命名冲突风险。 最后你不得不jQuery.prototype.F = function () {} jQuery.F 不会成功,因为jQuery这时候还没有建立起来. 很明显init比F更有说明性.

jQuery.fn 就是 jQuery.prototype

如果不考虑扩展插件,上面的代码是不是就够用了?

F就放在闭包里面,内部使用,对外只提供window.jQuery jQuery和F指向同一个原型就行了 jQury没有建立起来,但是F建立了,用F来做构建工作, 做完了,再让jQuery与F相同就行了,对外使用和扩展统一用jQuery


var rootjQuery;
       // 构建jQuery对象
        function F(selector, context, rootjQuery){
             console.log('F'); 
            
            return this;
        }
        F.prototype={
             constructor: jQuery,
             say:function(){
                  console.log('hello');
             }
     
        };
       
       var jQuery = function( selector, context ) {
           console.log('jQ');
          // return new jQuery.fn.init( selector, context, rootjQuery );
           return new F( selector, context, rootjQuery );
       }
 
     jQuery.prototype=   F.prototype;

 
   
   
   var a =jQuery('#ss');
       console.log(a);
       a.say();
       jQuery.prototype.addbox=function(){

           console.log("add box ");

       }

       a.addbox();

框架和类库设计思考的区别

@yakczh 和我碰到的问题一样啊,不知道你有思考出来为什么吗?在线等

@ChrisKempon324 考虑到扩展插件的问题的话,可以加一句

 jQuery.fn = jQuery.prototype = F.prototype;

还是没明白为什么jQuery要这么干

回到顶部