var IDate=(function(){
var self,//当前操作的IDate实例,实现静态方法、访问控制
names={//原生Date类与本类方法名对应列表
y:"FullYear",
M:"Month",
d:"Date",
h:"Hours",
m:"Minutes",
s:"Seconds",
ms:"Milliseconds"
};
function argParse(k,arg){
var res;
if(arguments.length){
if(typeof arg ==="number"){
set(k,arg);//内部方法调用,不使用self
return self;
}else if(typeof arg ==="string"){
if(/^[+-]?\d+$/.test(arg)){
var dir;
if(arg.charAt(0)==="+"){
arg=parseInt(arg,10);
dir=1;
}else if(arg.charAt(0)==="-"){
arg=parseInt(arg.slice(1),10);
dir=-1;
}
set(k,arg,dir);
return self;
}
}
}
return get(k);
}
function set(k,v,dir){
var dateName=names[k];
if(!dir){
if(k==="M"){
v--;
}
self.date['set'+dateName](v);//访问暴露在外的属性使用self
}else{
self.date['set'+dateName](v*dir+self.date["get"+dateName]());
}
}
function get(k){
var res=self.date['get'+names[k]]();
if(k==="M"){
res++;
}
return res;
}
function IDate(date){
if(arguments.length){
if(date instanceof IDate){//防止重复实例化,复制使用:new IDate(iDate.t());
return date;
}else if(date instanceof Date){
this.date=date;
}else{
this.date=new Date(parseInt(date,10));
}
}else{
this.date=new Date();
}
}
//批量生成外部使用方法:
var proto={};
for(var name in names){
proto[name]=(function(name){
return function(arg){
self=this;
return argParse(name,arg);
};
}(name));
}
proto.t=function() {
return this.date.getTime();
};
proto.toString=function() {
return this.y()+"-"+this.M()+"-"+this.d()+" "+this.h()+":"+this.m()+":"+this.s();
};
IDate.prototype=proto;
return IDate;
}());
|