丰富自己的javascript类库

Posted 骆宏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了丰富自己的javascript类库相关的知识,希望对你有一定的参考价值。

丰富自己的javascript类库

        每个优秀的开发者都会形成自己的类库,作为一个java开发者,我们也会写一大堆的工具类,用于简化我们的开发工作。但是作为一个全站攻城狮,不仅仅只是懂的形成java的类库,javascript的类库也同样重要。好啦,这篇文章不多说废话,下面对的代码提供了一些非常方便的工具类,或者是对javascript已有对象的扩展,比如字符串的扩展,日期对象的扩展,数组的扩展等。同样的,也提供了一个StringBuffer对象,该对象的用法基本也与java.lang.StringBuffer一样...
/**
 * 该文件包含了一些模拟java常用类的相关javascript类
 * 这里面主要包含了java.lang,java.util包中一些常用的类
 * 
 * 为了更加容易操作字符串,这里面也对字符串进行了赠强
 * 对数组,日期也进行了增强
 * 
 * 比如:StringBuffer,List,Map,Set等
 * @author:luohong
 * @date:2015-10-21 13:40 pm
 * @email [email protected]
 */
//========================================实现一个StringBuffer====================================//
/**
 * 模拟StringBuffer
 * 使用过程基本上和java.lang.StringBuffer一样,但是在toString中可以插入风格符,默认分隔符为','
 * */
function StringBuffer(){
	this.strs = [];  //用数组来缓存所有的内容

	if(typeof StringBuffer._initialized == "undefined"){
		StringBuffer._initalized = true;  //已经初始化过了,不需要重复初始化

		StringBuffer.prototype.append = function(str){
			this.strs.push(str);
			return this;
		};

		StringBuffer.prototype.toString = function(seperator){
			if(!seperator){
				seperator = "";
			}
			return this.strs.join(seperator);
		};
	}
}
//========================================实现一个StringBuffer====================================//


//====================================增强字符串=============================================//
/**
 * 判断字符串是否为空。
 * 
 * @returns {Boolean}
 */
String.prototype.isEmpty = function() {
	return (this == null || this == undefined || this == '');
};

/**
 * 功能:移除首尾空格
 */
String.prototype.trim = function() {
	return this.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, '');
};

/**
 * 功能:移除左边空格
 */
String.prototype.lTrim = function() {
	return this.replace(/(^\s*)/g, "");
};

/**
 * 功能:移除右边空格
 */
String.prototype.rTrim = function() {
	return this.replace(/(\s*$)/g, "");
};

/**
 * 判断结束是否相等
 * 
 * @param str
 * @param isCasesensitive
 * @returns {Boolean}
 */
String.prototype.endWith = function(str, isCasesensitive) {
	if (str == null || str == "" || this.length == 0
			|| str.length > this.length)
		return false;
	var tmp = this.substring(this.length - str.length);
	if (isCasesensitive == undefined || isCasesensitive) {
		return tmp == str;
	} else {
		return tmp.toLowerCase() == str.toLowerCase();
	}
};

/**
 * 判断开始是否相等
 * 
 * @param str
 * @param isCasesensitive
 * @returns {Boolean}
 */
String.prototype.startWith = function(str, isCasesensitive) {
	if (str == null || str == "" || this.length == 0
			|| str.length > this.length)
		return false;
	var tmp = this.substr(0, str.length);
	if (isCasesensitive == undefined || isCasesensitive) {
		return tmp == str;
	} else {
		return tmp.toLowerCase() == str.toLowerCase();
	}
};

/**
 * 在字符串左边补齐指定数量的字符
 * 
 * @param c
 *            指定的字符
 * @param count
 *            补齐的次数 使用方法: var str="999"; str=str.leftPad("0",3); str将输出 "000999"
 * @returns
 */
String.prototype.leftPad = function(c, count) {
	if (!isNaN(count)) {
		var a = "";
		for ( var i = this.length; i < count; i++) {
			a = a.concat(c);
		}
		a = a.concat(this);
		return a;
	}
	return null;
};

/**
 * 在字符串右边补齐指定数量的字符
 * 
 * @param c
 *            指定的字符
 * @param count
 *            补齐的次数 使用方法: var str="999"; str=str.rightPad("0",3); str将输出
 *            "999000"
 * @returns
 */
String.prototype.rightPad = function(c, count) {
	if (!isNaN(count)) {
		var a = this;
		for ( var i = this.length; i < count; i++) {
			a = a.concat(c);
		}
		return a;
	}
	return null;
};

/**
 * 对html字符进行编码 用法: str=str.htmlEncode();
 * 
 * @returns
 */
String.prototype.htmlEncode = function() {
	return this.replace(/&/g, "&").replace(/</g, "<").replace(/>/g,
			">").replace(/\"/g, """).replace(/\'/g, "'");
};

/**
 * 对html字符串解码 用法: str=str.htmlDecode();
 * 
 * @returns
 */
String.prototype.htmlDecode = function() {
	return this.replace(/\&\;/g, '\&').replace(/\>\;/g, '\>').replace(
			/\<\;/g, '\<').replace(/\"\;/g, '\'').replace(/\&\#39\;/g,
			'\'');
};

/**
 * 对json中的特殊字符进行转义
 */
String.prototype.jsonEscape = function() {
	return this.replace(/\"/g, """).replace(/\n/g, "&nuot;");
};

/**
 * 对json中的特殊字符进行转义
 */
String.prototype.jsonUnescape = function() {
	return this.replace(/"/g, "\"").replace(/&nuot;/g, "\n");
};

/**
 * 字符串替换
 * 
 * @param s1
 *            需要替换的字符
 * @param s2
 *            替换的字符。
 * @returns
 */
String.prototype.replaceAll = function(s1, s2) {
	return this.replace(new RegExp(s1, "gm"), s2);
};

/**
 * 获取url参数
 * 
 * @returns {object}
 */
String.prototype.getArgs = function() {
	var args = {};
	if (this.indexOf("?") > -1) {
		var argStr = this.split("?")[1], argAry = argStr.split("&");

		for ( var i = 0, c; c = argAry[i++];) {
			var pos = c.indexOf("=");
			if (pos == -1)
				continue;
			var argName = c.substring(0, pos), argVal = c.substring(pos + 1);
			argVal = decodeURIComponent(argVal);
			args[argName] = argVal;
		}
	}
	return args;
};

/**
 * var str=String.format("姓名:{0},性别:{1}","ray","男"); alert(str);
 * 
 * @returns
 */
String.prototype.format = function() {
	var template = arguments[0];
	var args = arguments;
	var str = template.replace(/\{(\d+)\}/g, function(m, i) {
		var k = parseInt(i) + 1;
		return args[k];
	});
	return str;
};
//====================================增强字符串=============================================//

//====================================增强数组==============================================//
/**
 * 移除数组中指定对象
 */
Array.prototype.remove = function(val) {
	for ( var i = 0; i < this.length; i++) {
		if (this[i] === val) {
			this.splice(i, 1);
			i--;
		}
	}
	return this;
};

//插入元素
Array.prototype.insert = function(index, item) {
	this.splice(index, 0, item);
	return this;
};

/**
 * 去除数组中的重复项
 * 
 * @function [method]
 *           判断对象是否相同的方法(可选参数,默认实现是深度匹配两个对象是否相同),示例:function(x,y){if(x.id===y.id)return
 *           true;}
 */
Array.prototype.unique = function(method) {
	if (!angular.isArray(this))
		return this;
	var sameObj = method || function(a, b) {
		var tag = true;
		for ( var x in a) {
			if (!b[x])
				return false;
			if (typeof (a[x]) === 'object') {
				tag = sameObj(a[x], b[x]);
			} else {
				if (a[x] !== b[x])
					return false;
			}
		}
		return tag;
	}
	
	var flag, that = this.slice(0);
	this.length = 0;
	for ( var i = 0; i < that.length; i++) {
		var x = that[i];
		flag = true;
		for ( var j = 0; j < this.length; j++) {
			y = this[j];
			if (sameObj(x, y)) {
				flag = false;
				break;
			}
		}
		if (flag)
			this[this.length] = x;
	}
	return this;
}
//====================================增强数组==============================================//


//=====================================增强date,获取xxxx-MM-yy hh:mm:ss格式日期==========================================//
/**
 * 返回当前时间,格式如下:2016-06-06 12:12:12
 */
Date.prototype.current = function(){
	var year = this.getFullYear();
	var month = (this.getMonth() + 1) < 10 ? (0 + "" + (this.getMonth() + 1)) : (this.getDate() + 1);
	var date = this.getDate() < 10 ? (0 + "" + this.getDate()) : this.getDate();
	var hours = this.getHours()  < 10 ? (0 + "" + this.getHours()) : this.getHours();
	var minutes = this.getMinutes() < 10 ? (0 + "" + this.getMinutes()) : this.getMinutes();
	var seconds = this.getSeconds() < 10 ? (0 + "" + this.getSeconds()) : this.getSeconds();
	return year + "-" + month + "-" + date + 
						" " + hours + ":" + minutes + ":" + seconds;			
};

/**
 * 返回当前日期,格式如下:2016-06-06
 */
Date.prototype.currentDate = function(){
	var year = this.getFullYear();
	var month = this.getMonth() + 1;
	if(month < 10){
		month = "0" + month;
	}
	var date = this.getDate() < 10 ? (0 + "" + this.getDate()) : this.getDate();
	return year + "-" + month + "-" + date;
};
//=====================================增强date,获取xxxx-MM-yy hh:mm:ss格式日期==========================================//
上面的代码,提供了一些在java中常用的方法,是的javascript的开发与java的开发非常的相似,嘿嘿,javascript一样可以写的跟java一样的6。比如
var sb = new StringBuffer();
sb.append('hello').append(new Date().getTime()).append();

var date = new Date();
date.current();
date.currentDate();

var str = "";
str.isEmpty();            //true
str.startWith('aaaa');    // false

var array = [1,2,2,3];    //[1,2,3]
array.<span style="font-family: Arial, Helvetica, sans-serif;">unique</span>();
        当然,上面的代码,我们是直接通过原型对象扩展了javascript基础对象,下面提供一个日期工具类,用于操作日期的相关操作:比较时间,获取当前月份的第一天和最后一天,格式化日期等
/**
 * date工具类
 * 目前只有格式化的功能
 * 
 * @author 沈少钦
 * @date 2016-04-20 11:19
 */
var DateUtils = {
    /**
     *
     * @param  {[Date]} date [日期对象] , if no, then use new Date(). that is current computer date
     * @param  {[Date]} pattern [格式规则], if no, then use  DateUtils.DEFAULT_DATE_TIME_PATTERN
     * @return {[string]}      [格式化的日期字符串]
     */
    format: function(date /*optional*/ , pattern /*optional*/ ) {
         function deal(date, format) {
            var map = {
                "M": date.getMonth() + 1, //月份 
                "d": date.getDate(), //日 
                "H": date.getHours(), //小时 
                "m": date.getMinutes(), //分 
                "s": date.getSeconds(), //秒 
                "q": Math.floor((date.getMonth() + 3) / 3), //季度 
                "S": date.getMilliseconds() //毫秒 
            };
            format = format.replace(/([yMdHmsqS])+/g, function(all, t) {
                var v = map[t];
                if (v !== undefined) {
                    if (all.length > 1) {
                        v = '0' + v;
                        v = v.substr(v.length - 2);
                    }
                    return v;
                } else if (t === 'y') {
                    return (date.getFullYear() + '').substr(4 - all.length);
                }
                return all;
            });
            return format;
        }
        switch (arguments.length) {
            case 0:
                return deal(new Date(), DateUtils._CONS_.DEFAULT_DATE_TIME_PATTERN);
            case 1:
                if (arguments[0] instanceof Date) {
                    return deal(arguments[0], DateUtils._CONS_.DEFAULT_DATE_TIME_PATTERN);
                } else {
                    return deal(DateUtils._CONS_.DEFAULT_DATE_TIME_PATTERN, arguments[0]);
                }
            case 2:
                return deal(arguments[0], arguments[1]);
        }       
    },

    getChineseWeeks: function(date) {
        if (date === null || date === undefined) {
            date = new Date();
        }
        var value = date.getDay()-1;
        var result = '星期';
        switch (value) {
            case 0:
                result += "一";
                break;
            case 1:
                result += "二";
                break;
            case 2:
                result += "三";
                break;
            case 3:
                result += "四";
                break;
            case 4:
                result += "五";
                break;
            case 5:
                result += "六";
                break;
            case 6:
                result += "日";
                break;
        }
        return result;
    },
    
    getEnglishWeeks: function(date) {
        if (date === null || date === undefined) {
            date = new Date();
        }
        var value = date.getDay()-1;
        switch (value) {
            case 0:
                return "Monday";
            case 1:
                return "Tuesday";
            case 2:
                return "Wensday";
            case 3:
                return "Thursday";
            case 4:
                return "Friday";
            case 5:
                return "Saturday";
            case 6:
                return "Sunday";
        }
    },

    /**
     * 计算时间差
     * @param  startTime 开始时间
     * @param  endTime 结束时间
     * @param  diffType 时间差类型,second,minute,hour,day
     * @return 返回时间差,整数类型
     *
     * 使用例子:
     * var result = DateUtils.getDateDiff("2010-02-26 16:00:00", "2011-07-02 21:48:40", "second");
     * var result = DateUtils.getDateDiff("2010-02-26 16:00:00", "2011-07-02 21:48:40", "minute");
     * var result = DateUtils.getDateDiff("2010-02-26 16:00:00", "2011-07-02 21:48:40", "hour");
     * var result = DateUtils.getDateDiff("2010-02-26 16:00:00", "2011-07-02 21:48:40", "day");
     */
    getDateDiff: function(startTime, endTime, diffType) {
        //将xxxx-xx-xx的时间格式,转换为 xxxx/xx/xx的格式 
        startTime = startTime.replace(/\-/g, "/");
        endTime = endTime.replace(/\-/g, "/");
        
        //将计算间隔类性字符转换为小写
        diffType = diffType.toLowerCase();
        var sTime = new Date(startTime);      //开始时间
        var eTime = new Date(endTime);  //结束时间
        var divNum = 1;
        switch (diffType) {
            case "second":
                divNum = 1000;
                break;
            case "minute":
                divNum = 1000 * 60;
                break;
            case "hour":
                divNum = 1000 * 3600;
                break;
            case "day":
                divNum = 1000 * 3600 * 24;
                break;
            default:
                break;
        }
        return parseInt((eTime.getTime() - sTime.getTime()) / parseInt(divNum));
    },

    /**
     *  将秒格式化为: x小时z分钟y秒
     * @param  {int} seconds 秒
     */
    toChineseTime: function(seconds){
        var hour = "";
        var minute = parseInt(seconds / 60);
        seconds = parseInt(seconds % 60);
        if(minute >= 60){
            hour = parseInt(minute / 60);
            minute = parseInt(minute % 60);
        }
        var result = seconds + "秒";
        if(minute){
            result = minute + "分" + result;
        }    
        if(hour){
            result = hour + "小时" + result;
        }
        return result;
    },
    
    /**
     * 获取当前日期的前几天日期
     * @param n 间隔天数
     * @param startDate 起始日期,默认为当天
     * 使用例子:DateUtils.getBeforeDate(5), DateUtils.getBeforeDate(5, '2016-05-06')
     * 返回格式如:yyyy-mm-dd
     */
    getBeforeDate: function(n, startDate){
        var n = n;
        
        var d = null;
        if(!startDate){
            d = new Date();
        }else{
            var strs = startDate.split('-');
            d = new Date();
            d.setYear(strs[0]);
            d.setMonth(strs[1] - 1);
            d.setDate(strs[2]);
        }
        var year = d.getFullYear();
        var mon=d.getMonth()+1;
        var day=d.getDate();
        d.setTime(d.getTime() - n * 1000 * 60 * 60 * 24);
        year = d.getFullYear();
        mon = d.getMonth() + 1;
        day = d.getDate();
        s = year+"-"+(mon<10?('0'+mon):mon)+"-"+(day<10?('0'+day):day);
        return s;
    },

    /**
     * 获取当前日期的后几天日期
     * @param n 间隔天数
     * @param startDate 起始日期,默认为当天
     * 使用例子:DateUtils.getAfterDate(5), DateUtils.getAfterDate(5, '2016-05-06')
     * 返回格式如:yyyy-mm-dd
     */
    getAfterDate: function(n, startDate){
        var n = n;
        
        var d = null;
        if(!startDate){
            d = new Date();
        }else{
            var strs = startDate.split('-');
            d = new Date();
            d.setYear(strs[0]);
            d.setMonth(strs[1] - 1);
            d.setDate(strs[2]);
        }

        d.setTime(d.getTime() + n * 1000 * 60 * 60 * 24);  //更新时间
        year = d.getFullYear();
        mon = d.getMonth() + 1;
        day = d.getDate();
        s = year+"-"+(mon<10?('0'+mon):mon)+"-"+(day<10?('0'+day):day);
        return s;
    },

    /**
     * 获取当前月第一天
     * @returns {Date}
     */
    getCurrentMonthFirst: function(){
		var date=new Date();
		date.setDate(1);
		return date;
	},
	
	/**
	 * 获取当前月最后一天
	 * @returns {Date}
	 */
	getCurrentMonthLast: function(){
		var date=new Date();
		var currentMonth=date.getMonth();
		var nextMonth=++currentMonth;
		var nextMonthFirstDay=new Date(date.getFullYear(),nextMonth,1);
		var oneDay=1000*60*60*24;
		return new Date(nextMonthFirstDay-oneDay);
	}
}

DateUtils._CONS_ = {
    DEFAULT_DATE_PATTERN: "yyyy-MM-dd", //默认的 年月日模式
    DEFAULT_DATE_TIME_PATTERN: "yyyy-MM-dd HH:mm:ss", //默认的 完全模式
    DEFAULT_TIME_PATTERN: "HH:mm:ss", //默认的 时分秒模式
    DEFAULT_MON_DAY_HOU_MIN_PATTERN: "MM-dd HH:mm", //默认的 月日时分模式
    DEFAULT_MON_DAY_PATTERN: "MM-dd", //默认的 月日模式
    DEFAULT_HOU_MIN_PATTERN: "HH:mm" //默认的 时分模式
};

总结

        有了上面的例子,我们就可以将javascript一些常用的组件封装起来,形成我们自己的开发类库,以后开发新的项目,直接将这些js类库搬移过去,可以极大的简化我们寻找代码的时间,不必要依赖过多的google,然后copy的过程。

以上是关于丰富自己的javascript类库的主要内容,如果未能解决你的问题,请参考以下文章

封装自己的JavaScript类库

Ipython知识点总结

JavaScript : 零基础打造自己的jquery类库

JavaScript-创建第一个自己的类库

JavaScript之jQuery-1 jQuery概述jQuery的编程步骤jQuery对象

javascript 框架根基技巧布局CSS控件 JavaScript 类库