面向对象Javascript核心支持代码

    JQury框架绝对是首先页面开发的首选,代码短小强悍,缺点就是面向对象特性不足,所幸有不少插件!至于Ext就是一个庞然大物了,高度面向对象,类似于MFC的庞大API和控件库,运行起来,浏览器就累得够呛,开发也够呛,使用代码来创建界面绝对是个糟糕的方式,Javascript的弱语言类型使得Ext开发就像行走在雷区,减少bug的唯一方法就是不要写出bug,一旦出现bug,调试将是一件极为痛苦的事情 !在几千行代码里跟踪、跳转真让人抓狂!

     Javascript做面向对象开发的时候,总是会用到很多模拟面向对象特性的方法,这些方法就构成了支撑面向对象Javascript的核心代码,以下就是部分代码,其中参考了很多JQuery与Ext的核心代码,用来学习还不错,也可以做一些小的开发!

/*
功能:核心脚本方法
作者:LQB
2008-12-22
*/
var JCore = {//构造核心对象
    version:1.0,
    $import:function(importFile){
        var file = importFile.toString();
        var IsRelativePath = (file.indexOf("$")==0 ||file.indexOf("/")==-1);//相对路径(相对于JCore)
        var path=file;
        if(IsRelativePath){//计算路径
            if(file.indexOf("$")==0)
                file = file.substr(1);
            path = JCore.$dir+file;
        }
        var newElement=null,i=0;
        var ext = path.substr(path.lastIndexOf(".")+1);
        if(ext.toLowerCase()=="js"){
            var scriptTags = document.getElementsByTagName("script");
            for(var i=0;i
  
  
   
   length;i++) {  
                
   
   if(scriptTags[i].src && scriptTags[i].src.indexOf(path)!=-1)
                    
   
   return;
            }
            newElement=
   
   document.createElement("
   
   script");
            newElement.type="
   
   text/javascript";
            newElement.src=path;
        }
        
   
   else 
   
   if(ext.toLowerCase()=="
   
   css"){
            
   
   var linkTags = 
   
   document.getElementsByTagName("
   
   link");
            
   
   for(
   
   var i=0;iTags.
   
   length;i++) {
                
   
   if(linkTags[i].href && linkTags[i].href.indexOf(path)!=-1)
                    
   
   return;
            }
            newElement=
   
   document.createElement("
   
   link");
            newElement.type="
   
   text/css";
            newElement.rel="
   
   Stylesheet";
            newElement.href=path;
        }
        
   
   else
            
   
   return;
        
   
   var head=
   
   document.getElementsByTagName("
   
   head")[0];
        head.appendChild(newElement);
    },
    $dir : 
   
   function(){
            
   
   var scriptTags = 
   
   document.getElementsByTagName("
   
   script");
            
   
   for(
   
   var i=0;i
   
   
    
    length;i++) {  
                
    
    if(scriptTags[i].src && scriptTags[i].src.match(/JCore/.js$/)) {  
                    path = scriptTags[i].src.replace(/JCore/.js$/,"
    
    ");   
                    
    
    return path;
                }
            }
            
    
    return "
    
    ";
    }(),
    $ : 
    
    function(element){
	        
    
    return (
    
    typeof(element) == 'object' ? element : 
    
    document.getElementById(element));
	    },
	browser : {
	    isFirefox:navigator.userAgent.toLowerCase().indexOf ('gecko') != -1,
	    isChrome:navigator.userAgent.toLowerCase().indexOf ('chrome') != -1,
	    isOpera:navigator.userAgent.toLowerCase().indexOf ('opera') != -1,
	    isIE:navigator.userAgent.toLowerCase().indexOf ('msie') != -1,
	    isIE7:navigator.userAgent.toLowerCase().indexOf ('7.0') != -1
    },
	onReady: 
    
    function(newFunction){
		
    
    if(
    
    typeof(newFunction) == 'undefined')
			
    
    return 
    
    false;
		
    
    this.domReady = 
    
    false;
		
    
    if(
    
    typeof(functions) == 'undefined')
			
    
    var functions = [];
		functions.push(newFunction);
		
		
    
    var initial = 
    
    function(){
    
    //执行事件列表
			
    
    for(
    
    var i=0; i< functions.
    
    length;i++){
				functions[i]();
			}
		}
		
    
    this.ready = 
    
    function(){
    
    //加载事件
			
    
    if(
    
    this.domReady)
				initial();
			
    
    var Browser = JCore.browser;	
			
    
    if (Browser.isFirefox || Browser.isOpera || Browser.isChrome) {
    
    //FX
				
    
    try {
					
    
    document.removeEventListener('DOMContentLoaded', initial);
				}
    
    catch(e){}
				
    
    document.addEventListener('DOMContentLoaded', initial, 
    
    false);
				
    
    this.domReady = 
    
    true;
			}
			
    
    else 
    
    if (Browser.isIE) {
    
    //IE
				
    
    var timer = 
    
    window.
    
    setInterval(
    
    function(){
					
    
    try {
					    
    
    var IsReady = 
    
    false;
						
    
    document.body.doScroll("
    
    left");
						IsReady=
    
    true;
						initial();
						
    
    window.
    
    clearInterval(timer);
						
    
    this.domReady = 
    
    true;
					} 
					
    
    catch (e){
					    
    
    if(IsReady){
    
    //文档加载已经完毕,抛出异常说明是调用的方法出错
					        
    
    var ErrorMsg = "
    
    onReady的方法中发生错误!/r/n";
					            ErrorMsg+="
    
    错误信息:"+e.message+"
    
    /r/n";
					            ErrorMsg+="
    
    错误描述:"+e.description+"
    
    /r/n";
					            ErrorMsg+="
    
    错误类型:"+e.
    
    name+"
    
    /r/n";
					            
    
    alert(ErrorMsg);
					            
    
    window.
    
    clearInterval(timer);
					    }
					}
				}
				, 5);	
			}
		}
	    
    
    this.ready();
	},
	apply:
    
    function(oDes, oSrc,bReplace){
    
    //为对象拷贝其它对象的属性,bReplace可选
        
    
    if(oDes && oSrc && 
    
    typeof(oSrc) == 'object'){
            
    
    for(
    
    var p 
    
    in oSrc){
                
    
    if(bReplace == 
    
    false && oDes[p] != 
    
    null) { 
    
    continue; }
                oDes[p] = oSrc[p];
            }
        }
        
    
    return oDes;
    },
    override : 
    
    function(origclass, overrides){
    
    //为类增加重载方法,eg:override(function class(){},{A:function(){},B:function(){}});
            
    
    if(overrides){
                
    
    var p = origclass.
    
    prototype;
                
    
    for(
    
    var method 
    
    in overrides){
                    p[method] = overrides[method];
                }
            }
        },
    extend  :
    
    function(){
            
    
    // inline overrides
            
    
    var inlineOverride = 
    
    function(o){
                
    
    for (
    
    var m 
    
    in o) {
                    
    
    this[m] = o[m];
                }
            };
            
    
    /*需要实现重载的基类方法需要在父类prototype中定义;
            * 在子类中方法的可见度:子类构造中的属性>父类构造中的属性>子类prototype定义的属性==overrides>父类prototype定义的属性
            * 由于overrides方法被附加到子类的prototype中,所以:子类prototype定义的属性与overrides,两者后定义的可见
            * extend方法将重写子类的prototype,因此在子类的prototype上定义属性则必须在extend()方法调用之后再定义才有效
            * 对于一个类:构造中定义的属性>prototype定义的属性
            *
            *类派生的准则:
            *   1.建议把基类中可重写的方法定义在基类prototype中
            *   2.如果在派生类的prototype中定义属性方法,必须在extend()方法之后
            *   3.在派生类的构造中调用基类的构造:
            *       if(Sub.superclass) //sub即子类的名称
            *           Sub.superclass.constructor.call(this, Args);//Args即父类的构造方法的参数
            *   4.注意数组的浅拷贝问题
            *示例:
            *   var ClassA=function(){this.Show=function(){alert("Hello World!");}};
            *   var ClassB=function(){};
            *   JCore.extend(ClassB,ClassA);
            *   var ObjectB = new ClassB();
            *   ObjectB.Show();
            */
            
    
    return 
    
    function(subFn, superFn, overrides){
    
    //子类,父类,重载方法(可选)
                
    
    var F = 
    
    function(){}, subFnPrototype, superFnPrototype = superFn.
    
    prototype;
                F.
    
    prototype = superFnPrototype;
                subFnPrototype = subFn.
    
    prototype = 
    
    new F();
                subFnPrototype.
    
    constructor = subFn;
                subFn.superclass = superFnPrototype;
    
    //父类
                
    
    if (superFnPrototype.
    
    constructor == Object.
    
    prototype.
    
    constructor) {
                    superFnPrototype.
    
    constructor = superFn;
                }
                subFn.override = 
    
    function(obj){
    
    //override
                    JCore.override(subFn, obj);
                };
                subFnPrototype.override = inlineOverride;
                
    
    if(overrides)
                    JCore.override(subFn, overrides);
                
    
    return subFn;
            };
    }(),
    
    //括号不可少,表示调用内部返回的方法
    namespace : 
    
    function(ns){
    
    //eg: JCore.namespace("JCore", "JCore.util");
            
    
    var args=
    
    arguments, o=
    
    null, i, j, d, rt;
            
    
    for (i=0; i
    
    
     
     length; ++i) {
     
     //遍历参数
                d=args[i].split("
     
     .");
     
     //遍历点分隔符
                rt = d[0];
                
     
     eval('
     
     if (
     
     typeof ' + rt + ' == "
     
     undefined"){' + rt + ' = {};} o = ' + rt + ';');
                
     
     for (j=1; j
     
     
      
      length; ++j) {
                    o[d[j]]=o[d[j]] || {};
                    o=o[d[j]];
                }
            }
    },
    isEmpty : 
      
      function(value){
            
      
      return value === 
      
      null || 
      
      typeof(value) === 'undefined' || value === '';
        },
    idSeed : 0,
    id : 
      
      function(el, prefix){
            prefix = prefix || "
      
      JCore-gen";
            el = 
      
      this.$(el);
            
      
      var id = prefix + (
      
      this.idSeed++);
            
      
      return el ? (el.id ? el.id : (el.id = id)) : id;
        }
};

      
      /*--------------------------------------------Function对象扩展-------------------------------------------*/

      
      var FunctionExtendMethod ={
    createCallback : 
      
      function(
      
      /*args...*/){
      
      //此参数即创造者的参数
        
      
      /*示例:function func1(arg1,arg2){alert(arg1+arg2);}
         *      var myfunc = func1.createCallback(1,2);
         *      myfunc();//即调用了func1
        **/
        
      
      var args = 
      
      arguments;
        
      
      var method = 
      
      this;
        
      
      return 
      
      function(
      
      /*args...*/) {
      
      //如果在调用时传了参数,则创建时传的参数无效
            
      
      var callArgs = 
      
      arguments.
      
      length>0 ? 
      
      arguments : args;
            
      
      return method.apply(
      
      window, callArgs);
        };
    },
    createDelegate : 
      
      function(argsArray,scope){
      
      //参数可选
        
      
      //参数一个数组,与createCallback区别:createCallback参数是可变参数,createDelegate的argsArray参数必须是数组
        
      
      var method = 
      
      this;
        
      
      return 
      
      function(
      
      /*args...*/) {
      
      //如果在调用时传了参数,则创建时传的参数无效
            
      
      var callArgs = 
      
      typeof(argsArray)=="
      
      undefined"?[]:argsArray;
            callArgs = 
      
      arguments.
      
      length>0 ? 
      
      arguments : callArgs;
            
      
      return method.apply(scope||
      
      window, callArgs);
        };
    },
    defer : 
      
      function(millis
      
      /*,args...*/){
      
      //参数:延迟时间(毫秒),可选参数列表
        
      
      /*示例:function func1(arg1,arg2){alert(arg1+arg2);}
         *      func1.defer(1000,1,2);//延迟1秒调用了func1(1,2)
        **/
        
      
      var callArgs = 
      
      Array.
      
      prototype.slice.call(
      
      arguments, 1);
        
      
      var fn = 
      
      this.createDelegate(callArgs);
        
      
      if(millis){
            
      
      return 
      
      setTimeout(fn, millis);
        }
        fn();
        
      
      return 0;
    },
    createInterceptor : 
      
      function(fcn, scope){
        
      
      if(
      
      typeof fcn != "
      
      function"){
            
      
      return 
      
      this;
        }
        
      
      var method = 
      
      this;
        
      
      return 
      
      function() {
            fcn.target = 
      
      this;
            fcn.method = method;
            
      
      if(fcn.apply(scope || 
      
      this || 
      
      window, 
      
      arguments) === 
      
      false){
                
      
      return;
            }
            
      
      return method.apply(
      
      this || 
      
      window, 
      
      arguments);
        };
    }
 };
 JCore.apply(
      
      Function.
      
      prototype,FunctionExtendMethod);
 
      
      /*--------------------------------------------String对象扩展----------------------------------------*/
 
      
      var StringExtendMethod ={
        trim : 
      
      function(){
      
      //去掉首尾空格
            
      
      return 
      
      this.replace(/(^/s*)|(/s*$)/g,"
      
      ");
      
      //将字符串前后空格,用空字符串替代。
        },
        replaceAll : 
      
      function (AFindText,ARepText){
      
      //替换所有,replace只替换第一个
                        raRegExp = 
      
      new 
      
      RegExp(AFindText,"
      
      g");
                        
      
      return 
      
      this.replace(raRegExp,ARepText);
        },
        htmlEncode : 
      
      function(){
      
      //编码HTML和解码Html。过滤掉双引号,单引号,符号&,符号<,符号
            
      
      return 
      
      this.replace(/&/g,"
      
      &").replace(/
      
      <").replace(/>/g,"
      
      >").replace(//"
      
      /g,"""
      
      ).replace(//'/g,"'"
      
      );
        },
        htmlDecode : 
      
      function(){
            
      
      return 
      
      this.replace(//&/;/g, '/&').replace(//>/;/g, '/>').replace(//</;/g, '/<').replace(//"/;/g, '/'').replace(//&/#39/;/g, '/'');
        },
        format : 
      
      function(){
            
      
      var args=
      
      arguments;
            
      
      return 
      
      this.replace(//{(/d+)/}/g, 
      
      function(m, i){
                    
      
      return args[i];
            });
        },
        convertWarpSymbol : 
      
      function(){
            
      
      var reg1,reg2,reg3;
            
      
      if(
      
      this.toLowerCase().indexOf("
      
      
")!=-1){ reg1 = / /gi; reg2 = / /gi; return this.replace(reg1," ").replace(reg2," /r/n"); } else{ reg1 = / /g;reg2 = //r/n/gi; return this.replace(reg1,"  ").replace(reg2,"
"); } }, IsNum : function(){ var reg = /^/d+$/g; return reg.test( this); } }; JCore.apply( String. prototype,StringExtendMethod); JCore.apply( String,{ //静态方法 trim : function(str){ //去掉首尾空格 return str.replace(/(^/s*)|(/s*$)/g," "); //将字符串前后空格,用空字符串替代。 } }); /*--------------------------------------------Array对象扩展----------------------------------------*/ var ArrayExtendMethod ={ //去掉数组中重复的元素 strip : function(){ if( this. length<2) return [ this[0]]||[]; var arr=[]; for( var i=0;i< this. length;i++){ var repeat= false; for( var j=0;j length;j++){ if( this[i]===arr[j]) repeat= true; } if(!repeat) arr.push( this[i]); } return arr; }, exists : function(item){ for( var i = 0 ; i < this. length ; i++ ){ if( item === this[i]) return true; } return false; }, indexOf : function(item){ for ( var i = 0; i < this. length; i++){ if( this[i] === item) return i; } return -1; }, remove : function(item){ var index = this.indexOf(item); if(index != -1){ this.splice(index, 1); } return this; } }; JCore.apply( Array. prototype,ArrayExtendMethod); /*--------------------------------------------Date对象扩展----------------------------------------*/ var DateExtendMethod ={ //返回时间间隔(毫秒) getElapsed : function(date) { return Math.abs((date || new Date()).getTime()- this.getTime()); } }; JCore.apply( Date. prototype,DateExtendMethod);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值