JavaScript类库D


Posted in Javascript onOctober 24, 2010

因为是辅助类库,所以为了兼容所有其他框架和类库,采用了包装器的方式对对象进行扩展。D类库的最主要的内容是针对js常用内置对象的扩展,比如:String,Number,Array,Date等,这些扩展偏于具体的业务逻辑,比如对String扩展的trim方法、对Date扩展的toStr方法等,都是对一些常用但对象本身不支持且框架类库也不支持或不完整支持的功能扩展。同时通过对应包装器的包装我们可以通过链式方法来操作对象,最后每个包装器都提供了拆箱(即还原为原生对象)方法。故包装器提供的实质是一个装箱、操作、拆箱的过程。

命名空间:

var D = {};

部分功能如下:

. String包装器

(function(){ 
//包装String 
D.str = function(s){ 
if(! (this instanceof y.str))return new y.str(s); 
this.val = (s!==undefined) ? s.toString() : ""; 
}; 
D.str.prototype = { 
//删除字符串两边空白 
trim : function(type){ 
var types = {0:"(^\\s+)|(\\s+$)",1:"^\\s+",2:"\\s+$"}; 
type = type || 0; 
this.val = this.val.replace(new RegExp(types[type],"g"),""); 
return this; 
}, 
//重复字符串 
repeat : function(n){ 
this.val = Array(n+1).join(this.val); 
return this; 
}, 
//字符串两边补白 
padding : function(len,dire,str){ 
if(this.val.length>=len)return this; 
dire = dire || 0; //[0代表左边,1代表右边] 
str = str || " "; //默认为一个空白字符 
var adder = []; 
for(var i=0,l = len - this.val.length; i<l;i++){ 
adder.push(str); 
} 
adder = adder.join(""); 
this.val = dire ? (this.val + adder) : (adder + this.val); 
return this; 
}, 
reverse : function(){ 
this.val = this.val.split("").reverse().join(""); 
return this; 
}, 
byteLen : function(){ 
return this.val.replace(/[^\x00-\xff]/g,"--").length; 
}, 
unBox : function(){ 
return this.val; 
} 
}; 
//alert(D.str(" 123 ").trim().repeat(2).padding(10,0,"x").reverse().unBox()); 
})();

.Array包装器
(function(){ 
//包装Array 
D.arr = function(arr){ 
if(!(this instanceof D.arr))return new D.arr(arr); 
this.val = arr || []; 
}; 
D.arr.prototype = { 
each : function(fn){ 
for(var i=0,len=this.val.length;i<len;i++){ 
if(fn.call(this.val[i])===false){ 
return this; 
} 
} 
return this; 
}, 
map : function(fn){ 
var copy = []; 
for(var i=0,len = this.val.length;i<len;i++){ 
copy.push(fn.call(this.val[i])); 
} 
this.val = copy; 
return this; 
}, 
filter : function(fn){ 
var copy = []; 
for(var i=0,len=this.val.length;i<len;i++){ 
fn.call(this.val[i]) && copy.push(this.val[i]); 
} 
this.val = copy; 
return this; 
}, 
remove : function(obj,fn){ 
fn = fn || function(m,n){ 
return m===n; 
}; 
for(var i=0,len = this.val.length;i<len;i++){ 
if(fn.call(this.val[i],obj)===true){ 
this.val.splice(i,1); 
} 
} 
return this; 
}, 
unique : function(){ 
var o = {},arr = []; 
for(var i=0,len = this.val.length;i<len;i++){ 
var itm = this.val[i]; 
(!o[itm] || (o[itm]!==itm) )&& (arr.push(itm),o[itm] = itm); 
} 
this.val = arr; 
return this; 
}, 
indexOf : function(obj,start){ 
var len = this.val.length,start = ~~start; 
start < 0 && (start+= len); 
for(;start<len;start++){ 
if(this.val[start]===obj)return start; 
} 
return -1; 
}, 
lastIndexOf : function(obj,start){ 
var len = this.val.length,start = arguments.length === 2 ? ~~start : len-1; 
start = start < 0 ? (start+len) : (start>=len?(len-1):start); 
for(;start>-1;start--){ 
if(this.val[start] === obj)return start; 
} 
return -1; 
}, 
unBox : function(){ 
return this.val; 
} 
}; 
//alert( D.arr(["123",123]).unique().unBox()); 
//alert(D.arr([1,2,3]).map(function(i){return ++i;}).filter(function(i){return i>2;}).remove(3).unBox()); 
})();

.Number包装器
(function(){ 
//包装Number 
D.num = function(num){ 
if(!(this instanceof D.num))return new D.num(num); 
this.val = Number(num) || 0; 
}; 
D.num.prototype = { 
padZore : function(len){ 
var val = this.val.toString(); 
if(val.length>=len)return this; 
for(var i=0,l = len-val.length;i<l;i++){ 
val = "0" + val; 
} 
return val; 
}, 
floatRound : function(n){ 
n = n || 0; 
var temp = Math.pow(10,n); 
this.val = Math.round(this.val * temp)/temp; 
return this; 
}, 
unBox : function(){ 
return this.val; 
} 
}; 
//alert(D.num(3.1235888).floatRound(3).unBox()); 
})();

.Date包装器
(function(){ 
//包装Date 
D.date = function(date){ 
if(!(this instanceof D.date))return new D.date(date); 
if(!(date instanceof Date)){ 
var d = new Date(date); 
this.val = (d == "Invalid Date" || d == "NaN") ? new Date() : new Date(date); 
}else{ 
this.val = date; 
} 
}; 
D.date.prototype = { 
toStr : function(tpl){ 
var date = this.val,tpl = tpl || "yyyy-MM-dd hh:mm:ss"; 
var v = [date.getFullYear(),date.getMilliseconds(),date.getMonth()+1,date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds()]; 
var k = "MM,M,dd,d,hh,h,mm,m,ss,s".split(","); 
var kv = {"yyyy":v[0],"yy":v[0].toString().substring(2),"mmss":("000"+v[1]).slice(-4),"ms":v[1]}; 
for(var i=2;i<v.length;i++){ 
kv[k[(i-2)*2]] = ("0" + v[i]).slice(-2); 
kv[k[(i-2)*2+1]] = v[i]; 
} 
for(var k in kv){ 
tpl = tpl.replace(new RegExp( k,"g"),kv[k]); 
} 
return tpl; 
}, 
unBox : function(){ 
return this.val; 
} 
}; 
//alert(D.date("2017-123-12").toStr("yyyy-MM-dd hh:mm:ss ms-mmss")); 
// alert(D.date("2017").unBox()); 
})();

.最后为了在脱离其他框架类库的情况下D也可以承担dom操作方面的任务,实现了Dom包装器,如下:
(function(){ 
2 //包装Dom 
3 D.dom = function(node){ 
4 if(!(this instanceof D.dom))return new D.dom(node); 
5 if(typeof node === "undefined"){ 
6 node = document.body; 
7 }else if(typeof node == "string"){ 
8 node = document.getElementById(node); 
9 !node && (node = document.body); 
}else{ 
!node.getElementById && (node = document.body); 
} 
this.val = node; 
}; 
D.dom.prototype = { 
inner : function(value){ 
this.val.innerHTML ? (value = value || "",this.val.innerHTML = value) : (value = value || 0,this.val.value = value); 
return this; 
}, 
attr : function(k,v){ 
if(typeof k == "object"){ 
for(var m in k){ 
this.val[m] = k[m]; 
} 
}else{ 
this.val[k] = v; 
} 
return this; 
}, 
css : function(k,v){ 
var style = this.val.style; 
if(typeof k == "object"){ 
for(var m in k){ 
style[m] = k[m]; 
} 
}else{ 
style[k] = v; 
} 
return this; 
}, 
addClass : function(cls){ 
var clsName = " " + this.val.className + " "; 
(clsName.indexOf(" " + cls + " ")==-1) && (clsName = (clsName + cls).replace(/^\s+/,"")); 
this.val.className = clsName; 
return this; 
}, 
removeClass : function(cls){ 
var clsName = " " + this.val.className + " "; 
this.val.className = clsName.replace(new RegExp(" "+cls+ " ","g"),"").replace(/(^\s+)|(\s+$)/,""); 
return this; 
}, 
addEvent : function(evType,fn){ 
var that = this, typeEvent = this.val["on"+evType]; 
if(!typeEvent){ 
(this.val["on"+evType] = function(){ 
var fnQueue = arguments.callee.funcs; 
for(var i=0;i<fnQueue.length;i++){ 
fnQueue[i].call(that.val); 
} 
}).funcs =[fn]; 
}else{ 
typeEvent.funcs.push(fn); 
} 
return this; 
}, 
delEvent : function(evType,fn){ 
if(fn===undefined){ 
this.val["on"+evType] = null; 
}else{ 
var fnQueue = this.val["on"+evType].funcs; 
for(var i=fnQueue.length-1;i>-1;i--){ 
if(fnQueue[i] === fn){ 
fnQueue.splice(i,1); 
break; 
} 
} 
fnQueue.length==0 && (this.val["on"+evType] = null); 
} 
return this; 
}, 
unBox : function(){ 
return this.val; 
} 
}; 
//静态方法 
var __ = D.dom; 
__.$ = function(id){ 
return typeof id == "string" ? document.getElementById(id) : id; 
}; 
__.$$ = function(tag,box){ 
return (box===undefined?document:box).getElementsByTagName(tag); 
}; 
__.$cls = function(cls,tag,node){ 
node = node === undefined ? document : node; 
cls = cls.replace(/(\.)|(^\s+)|(\s+$)/g,""); 
if(node.getElementsByClassName)return node.getElementsByClassName(cls); 
tag = tag === undefined ? "*" : tag; 
var filter = [], nodes = (tag==="*" && node.all) ? node.all : node.getElementsByTagName(tag); 
for(var i=0,j=nodes.length;i<j;i++){ 
nodes[i].nodeType==1 && ((" " + nodes[i].className + " ").indexOf(" "+cls+ " ")!=-1) && filter.push(nodes[i]); 
} 
return filter; 
}; 
//静态方法结束 
alert(D.dom.$cls(".abc").length); 
})();

Dom包装器的实例对象负责当前dom节点的自身操作。而"静态方法"部分则是提供了dom选择器的基本实现。

以上就是D类库的初级版本,其中的重要部分——对内置对象的扩展目前只有较少的方法扩展,比如对Number的扩展,在基于web的财务软件中,用到相当多的数字操作,其中有一些是常用处理,就可以将其添加入Number包装器,好处也是显而易见的。

最后如果你看到了这篇文章,也有足够的想法,我希望你能尽你所能来给于包装器更多的方法扩展,你的其中的一些主意可能会成为D成熟版本的一部分。

Javascript 相关文章推荐
js 获取浏览器高度和宽度值(多浏览器)
Sep 02 Javascript
javascript for循环设法提高性能
Feb 24 Javascript
javascript上传图片前预览图片兼容大多数浏览器
Oct 25 Javascript
用jquery写的一个万年历(自写)
Jan 20 Javascript
JS继承用法实例分析
Feb 05 Javascript
javascript实现动态标签云
Oct 16 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
Sep 03 Javascript
手写Node静态资源服务器的实现方法
Mar 20 Javascript
JavaScript中变量、指针和引用功能与操作示例
Aug 04 Javascript
详解Nuxt.js 实战集锦
Nov 19 Javascript
JS常见内存泄漏及解决方案解析
May 30 Javascript
Vue h函数的使用详解
Feb 18 Vue.js
一个简单的JavaScript数据缓存系统实现代码
Oct 24 #Javascript
Javascript 类型转换方法
Oct 24 #Javascript
js创建对象的几种常用方式小结(推荐)
Oct 24 #Javascript
JavaScript arguments 多参传值函数
Oct 24 #Javascript
ExtJs事件机制基本代码模型和流程解析
Oct 24 #Javascript
JQuery EasyUI 对话框的使用方法
Oct 24 #Javascript
javascript textContent与innerText的异同分析
Oct 22 #Javascript
You might like
同时提取多条新闻中的文本一例
2006/10/09 PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
2014/10/17 PHP
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
64位windows系统下安装Memcache缓存
2015/12/06 PHP
Yii 2.0在Grid中格式化时间方法示例
2017/06/06 PHP
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
AngularJS基础 ng-mouseover 指令简单示例
2016/08/02 Javascript
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
jQuery实现可兼容IE6的滚动监听功能
2017/09/20 jQuery
iview table render集成switch开关的实例
2018/03/14 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
vue全屏事件开发详解
2020/06/17 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
[48:31]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第二场 12.17
2020/12/19 DOTA
Python实现的简单万年历例子分享
2014/04/25 Python
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
Python学习教程之常用的内置函数大全
2017/07/14 Python
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
简单了解Python write writelines区别
2020/02/27 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
本科毕业生自我鉴定
2013/11/02 职场文书
学校课外活动总结
2014/05/08 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
医院2014国庆节活动策划方案
2014/09/21 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
物业保洁员管理制度
2015/08/05 职场文书
thinkphp 获取控制器及控制器方法
2021/04/16 PHP
Java生成读取条形码和二维码的简单示例
2021/07/09 Java/Android