现在的代码是仿jq写的,只是要实现jq中的一小部分,代码如下:(function(){
          
var window = this,
    undefined,
    _XICI = window.XICI,
    _$ = window.$,
    XICI = window.XICI = window.$ = function() {
        return new XICI.fn.init();
    };
    
XICI.fn = XICI.prototype = {
init: function() {
    var elements = new Array();
    
    for (var i = 0; i < arguments.length; i++) {
        var element = arguments;
        
        if (typeof element == 'string') {
            element = document.getElementById(element);
        }
        
        if (arguments.length == 1) { return element;}
        
        elements.push(element);
    }
    
    return elements;
},
alertme: function(){alert('alertme')}
};                })();现在外部调用 $.alertme(); 总是提示:对象不支持此属性或方法,
但是$.fn.alertme()就没有问题,不知为何
上来请教大家,请帮忙帮忙,多谢!

解决方案 »

  1.   

    帮你简化一下
    function $() { 
    }; 
        
    $.fn = { 
    alertme: function(){alert('alertme')} 
    }; 那何来$.alertme呢
      

  2.   

    因为XICI.fn = XICI.prototype = {   //这里声明了fn的对象,所以alertme()方法是属于$.fn而不是$的,this的指向不同
    init: function() { 
        var elements = new Array(); 
        
        for (var i = 0; i < arguments.length; i++) { 
            var element = arguments; 
            
            if (typeof element == 'string') { 
                element = document.getElementById(element); 
            } 
            
            if (arguments.length == 1) { return element;} 
            
            elements.push(element); 
        } 
        
        return elements; 
    }, 
    alertme: function(){alert('alertme')} 
    };            
      

  3.   

    或者指向 XICI , 而不是XICI.fn ?
      

  4.   

    指向XICI,LZ可以直接用XICI.alertme = function(){alert("alertme");};
    而LZ现在用的是prototype原型,这个需要new一个XICI对象才行,如下面的红字(function(){ 
              
    var window = this, 
        undefined, 
        _XICI = window.XICI, 
        _$ = window.$, 
        XICI = window.XICI = function() { 
            //return new XICI.fn.init(); 
        };
    XICI.fn = XICI.prototype = { 
    init: function() { 
        var elements = new Array(); 
        
        for (var i = 0; i < arguments.length; i++) { 
            var element = arguments; 
            
            if (typeof element == 'string') { 
                element = document.getElementById(element); 
            } 
            
            if (arguments.length == 1) { return element;} 
            
            elements.push(element); 
        } 
        
        return elements; 
    }, 
    alertme: function(){alert('alertme')} 
    };                
    $ = window.$ = new XICI();
    })();//测试
    $.alertme();//打印alertme
      

  5.   

    谢谢lihui_shine,代码现在已经可以了,但还觉得代码不够整洁,能不能把$ = window.$ = new XICI();改到上面的 var 中?
      

  6.   

    不能,因为原型prototype的使用是
    1.定义对象:var XICI = ...
    2.定义原型:XICI.prototype.xxx = function(){...};
    3.创建对象:var $ = new XICI();
    4.使用:$.xxx();
    2和3不能颠倒
      

  7.   

    多谢lihui_shine,我还想问一下,我想写个$(obj).addEvent('click',func)这样的调用,请问在框架内部怎么实现?