CNode

jQuery.fn.init.prototype = jQuery.fn;这样写好绕

Yyakczh发布于12 年前最后回复12 年前7 回复12204 浏览0 收藏

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)

Y
yaochun#1·12 年前

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

Y
yu521088#3·12 年前
引用 TimothyJin(1) $.fn 提供扩展插件 (2)namespace

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

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

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

T
TimothyJin#4·12 年前

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

T
tulayang#5·12 年前

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

jQuery.fn 就是 jQuery.prototype

Y
yakczh#6·12 年前
引用 TimothyJin(1) $.fn 提供扩展插件 (2)namespace

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

Y
yakczh#7·12 年前
引用 tulayangF需要一个命名空间来放置,如果你放到windows上,则有命名冲突风险。 最后你不得不jQuery.prototype.F = function () {} jQuery.F 不会成功,因为j...

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();
参与回复
登录后即可参与回复。登录