日期处理的js库(迷你版)--自建js库总结


Posted in Javascript onNovember 21, 2011

接口+继承+代码优化思想
先分享下我觉得一个很不错的js编程小技巧,达到很大的代码共用性! 因为很多js库会在原生的对象上进行直接原型扩展,但这是很不好的习惯,不仅加重了每个新实例对象的内存消耗,而且容易造成污染性误解(以为有这东西)!而这也是建js库一个准则:尽量少的原型扩展,特别是越根部的对象!

js建库准则
js建库准则(Dean Edwards在开发base2时候的一些体会)翻译版:http://biaoge.me/2009/12/239 js建库学习好地方:http://ejohn.org/blog/building-a-javascript-library/ 假如你有时间,再看一个建js库超级前沿的文档,包括css3,浏览器最新API(如querySelector) build-a-javascript-framework

用继承提高代码共用性
因为不在原生对象上进行扩展,所以需要一个对外的命名空间,而在这个对象下会有一些接口供外部调用,而为了提高本身js库的健壮性,需要在最大程度减小对外接口(最理想的就是只保存用户需要的接口)! 那么这里便有一个问题,我将它实例化吧:

var namespace={ 
IOfirst:function(){}, 
IOsecond:function(){} 
}

在对象namespace下有个东西需要给IOfirst跟IOsecond共用,而又不想暴露这个接口! 我是通过继承将所有对外接口通过一个父接口包装,然后在一个init方法下统一赋值,而在init这方法下,由于闭包的作用,达到了代码的共用性! 具体做法:

动态添加对外接口,加强代码灵活性

addIO:function(str){ 
var arrs = str.split("."), 
o = this; 
for (i=(arrs[0] == "Date$") ? 1 : 0; i0) 
{ 
var data=arrs[0] 
o[arrs[i]]=o[arrs[i]] ||function(){return this.parIO.apply(null,[data,arguments])}; 
o=o[arrs[i]]; 
} 
} 
InitFuns:function(){ 
var that=this; 
var funs=this.actionFun; 
//init interface for all functions(test successfully) 
var interfaces=["testLeap","disDayNum","todayBetween","getMonthByDay","getNextWeekByDay","getWeekByDay","newDate","compareDate"] 
var shift; 
do{ 
shift=interfaces.shift() 
that.addIO(shift); 
funs[shift]=function(){}; 
}while(interfaces.length>0) 
//set the common object and variable //for browers test 
var br={ 
ie:false,//IE6~8 
ff:false,//Firefox 
ch:false//Chrome 
} 
var nav=navigator.userAgent; 
if(!-[1,]) br.ie=true; 
else if(nav.indexOf("Firefox")>0) br.ff=true; 
else if(nav.indexOf("Chrome")>0) br.ch=true; 
//continue to set IO 
}

在控制台上输出初始化完成的接口: 
日期处理的js库(迷你版)--自建js库总结于是所有对外接口都绑定到parIO下面,这样在有很多接口的情况下可以少敲好多代码哦! 而关键的维系内外部枢纽的parIO负责找到子接口,传参,并返回

parIO:function(){ 
if(Date$.actionFun[arguments[0]]) 
{ 
var customFun=Date$.actionFun[arguments[0]] 
return customFun.apply(null,[arguments[1]]); 
} 
else 
console&&cosnole.log("empty"); 
},

而可以看到有三部分: 
日期处理的js库(迷你版)--自建js库总结在 //set the common object and variable 那里我们可以写我们的公用函数,变量,如判断浏览器,加入类似后台的sqlHelp 函数 之后便是初始化接口了:
funs.newDate=function(){ 
return formatDate(arguments[0][0]) 
} 
funs.getWeekByDay=function(){ 
return getWeekByDay(arguments[0][0]); 
} 
funs.getNextWeekByDay=function(){ 
var speDate=formatDate(arguments[0][0]); 
speDate.setDate(speDate.getDate()+7); 
return getWeekByDay(speDate); 
}

而且这样还有一个好处,就是你的代码不会给人家随便的复制去用,因为接口的内部联系性很大!例如上面的funs.getWeekByDay,funs.getNextWeekByDay公用了getWeekByDay()方法! 最后附上我的不成熟的js库以及接口声明,还望大牛帮忙改进下,万分感谢
/* 
//function:to compare two dates and return information "equal"/"more"/"less" 
//arguments num:2 
//arguments type: Date,Date 
//arguments declaration:1.the target object you need to compare(Subtrahend);2.the compare object(Minuend) 
//return data -- type: String ; three value: "more"(if target is larger),"equal"(if target is equal to compared object),"less"(if target is smaller) 
compareDate:function (objDate,comDate) 
{ 
}, 
//function:to format the string to Date ,and return 
//arguments num:1 
//arguments type: for this interface apply for overload , so String or Date is allowed 
//arguments declaration:if you pass String ,it should format to "YYYY-MM-DD" or "YYYY/MM/DD" or "YYYY:MM:DD" like "2008/10/12" 
//return date : type:Date;one value:the date you want after formatting 
newDate :function (str) 
{ 
}, 
//function:get the start date and end date of the week of the date you have passed and return the Json including {startDay,endDay} 
//arguments num:1 
//arguments type:for this interface apply for overload , so String or Date is allowed 
//arguments declaration:the day you want to get the first day and last day of in this weeek;if you pass String ,it should format to "YYYY-MM-DD" or "YYYY/MM/DD" or "YYYY:MM:DD" like "2008/10/12" 
//return data--type :Json ; one value:{startDay:"",endDay:""} ,you can get it by var.startDay(var is your custom variable) 
getWeekByDay :function (day) 
{ 
}, 
//function:get the start date and end date of next week of the date you have passed and return the Json including {startDay,endDay} 
//arguments num:1 
//arguments type:for this interface apply for overload , so String or Date is allowed 
//arguments declaration:the day you want to get the first day and last day of in this weeek;if you pass String ,it should format to "YYYY-MM-DD" or "YYYY/MM/DD" or "YYYY:MM:DD" like "2008/10/12" 
//return data--type :Json ; one value:{startDay:"",endDay:""} ,you can get it by var.startDay(var is your custom variable) 
getNextWeekByDay :function (day) 
{ 
}; 
//function:get the start date and end date of the month of the date you have passed and return the Json including {startDay,endDay} 
//arguments num:1 
//arguments type:Date 
//arguments declaration:the day you want to get the first day and last day of in this month 
//return data--type :Json ; one value:{startDay:"",endDay:""} ,you can get it by var.startDay(var is your custom variable) 
getMonthByDay :function (day) 
{ 
}, 
//function:to test if including today between the two dates you pass and return in boolean 
//arguments num:2 
//arguments type:Date,Date 
//arguments declaration:the procedure will test the larger and sort automatically ,so the order is no matter 
//return data-- type: boolean ; one value :true if today is between the two dates 
todayBetween :function (startDate,endDate) 
{ 
}, 
//function:to caculate the difference between two dates in days 
//arguments num:2 
//arguments type:Date,Date 
//arguments declaration:1.startDate(the one be reduced) 2.endDate(the one to reduce) 
//return data--type:Number ; one value:the different between these two dates 
disDayNum:function (startDate,endDate) 
{ 
}, 
//function:test the year of the date you have passed leap or not and return in boolean 
//arguments num:1 
//arguments type: for this interface apply for overload , so String or Date is allowed 
//arguments declaration:if you pass String ,it should format to "YYYY-MM-DD" or "YYYY/MM/DD" or "YYYY:MM:DD" like "2008/10/12" 
//return data -- type:boolean ;one value: true if it is leap year or false 
testLeap :function (date) 
{ 
} */

欢迎下载:Date$.js
Javascript 相关文章推荐
一个无限级XML绑定跨框架菜单(For IE)
Jan 27 Javascript
javascript 鼠标拖动图标技术
Feb 07 Javascript
nodeType属性返回被选节点的节点类型介绍
Nov 22 Javascript
js中的for如何实现foreach中的遍历
May 31 Javascript
JavaScript中Cookie操作实例
Jan 09 Javascript
js/jquery判断浏览器类型的方法小结
May 12 Javascript
整理Javascript数组学习笔记
Nov 29 Javascript
vue.js实现含搜索的多种复选框(附源码)
Mar 23 Javascript
javascript编程开发中取色器及封装$函数用法示例
Aug 09 Javascript
Express系列之multer上传的使用
Oct 27 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
Jan 26 Javascript
vue组件开发props验证的实现
Feb 12 Javascript
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
Nov 21 #Javascript
页面调用单个swf文件,嵌套出多个方法。
Nov 21 #Javascript
javascript中xml操作实现代码
Nov 21 #Javascript
js调用activeX获取u盘序列号的代码
Nov 21 #Javascript
15个款优秀的 jQuery 图片特效插件推荐
Nov 21 #Javascript
jQuery EasyUI API 中文文档 - TreeGrid 树表格使用介绍
Nov 21 #Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
Nov 19 #Javascript
You might like
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
PHP去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
PHP 手机归属地查询 api
2010/02/08 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
简单谈谈JS数组中的indexOf方法
2016/10/13 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
2017/05/11 Javascript
详解Node项目部署到云服务器上
2017/07/12 Javascript
Vue列表页渲染优化详解
2017/07/24 Javascript
ionic App问题总结系列之ionic点击系统返回键退出App
2017/08/19 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
Python中下划线的使用方法
2015/03/27 Python
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
Python Socket编程详细介绍
2017/03/23 Python
详解Python pygame安装过程笔记
2017/06/05 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
python读取xlsx的方法
2018/12/25 Python
Django中提示消息messages的设置方式
2019/11/15 Python
Python递归调用实现数字累加的代码
2020/02/25 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
python 实现任务管理清单案例
2020/04/25 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
让IE6支持css3,让 IE7、IE8 都支持CSS3
2011/10/09 HTML / CSS
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
下面代码从性能上考虑,有什么问题
2015/04/03 面试题
实习自我鉴定范文
2013/10/30 职场文书
大学生职业生涯设计书
2014/01/02 职场文书
信息专业学生学习的自我评价
2014/02/17 职场文书
博士导师推荐信
2015/03/25 职场文书
python使用shell脚本创建kafka连接器
2022/04/29 Python