写自已的js类库需要的核心代码


Posted in Javascript onJuly 16, 2012
(function(win) { 
var toString = Object.prototype.toString; 
var hasOwn = Object.prototype.hasOwnProperty; 
var class2type = {}; 
class2type["[object Boolean]"] = "boolean"; 
class2type["[object Number]"] = "number"; 
class2type["[object String]"] = "string"; 
class2type["[object Function]"] = "function"; 
class2type["[object Array]"] = "array"; 
class2type["[object Date]"] = "date"; 
class2type["[object RegExp]"] = "regexp"; 
class2type["[object Object]"] = "object"; 
win.type = function(obj) { 
return obj == null ? String(obj) : class2type[toString.call(obj)] || "object"; 
}; 
win.isBoolean = function(obj) { 
return type(obj) === "boolean"; 
}; 
win.isNumber = function(obj) { 
return type(obj) === "number"; 
}; 
win.isString = function(obj) { 
return type(obj) === "string"; 
}; 
win.isDate = function(obj) { 
return type(obj) === "date"; 
}; 
win.isRegExp = function(obj) { 
return type(obj) === "regexp"; 
}; 
win.isObject = function(obj) { 
return type(obj) === 'object'; 
}; 
win.isFunction = function(obj) { 
return type(obj) === "function"; 
}; 
win.isArray = function(obj) { 
return type(obj) === "array"; 
}; 
win.isWindow = function(obj) { 
return obj 
&& typeof obj === "object" 
&& "setInterval" in obj; 
}; 
win.isNumeric = function(obj) { 
return !isNaN(parseFloat(obj)) && isFinite(obj); 
}; 
win.isPlainObject = function(obj) { 
if (!obj 
|| type(obj) !== "object" 
|| obj.nodeType 
|| isWindow(obj)) { 
return false; 
} 
try { 
if (obj.constructor 
&& !hasOwn.call(obj, "constructor") 
&& !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { 
return false; 
} 
} catch (e) { 
return false; 
} 
var key; 
for (key in obj) { 
} 
return key === undefined || hasOwn.call(obj, key); 
}; 
win.isEmptyObject = function(obj) { 
for ( var name in obj) { 
return false; 
} 
return true; 
}; 
win.isPrimitive = function(obj){ 
var type = typeof obj; 
return type === 'string' || type === 'number' || type === 'boolean'; 
}; 
//HTMLElement 
win.isElement = function(obj){ 
return obj ? obj.nodeType === 1 : false; 
}; 
//TextNode 
win.isTextNode = function(obj){ 
return obj ? obj.nodeName === "#text" : false; 
}; 
win.isIterable = function(obj){ 
return (obj && typeof obj !== 'string') ? obj.length !== undefined : false; 
}; 
win.isDefined = function(obj){ 
return typeof obj !== 'undefined'; 
}; 
win.error = function(msg) { 
throw new Error(msg); 
}; 
win.now = function() { 
return (new Date()).getTime(); 
}; 
win.print = function(value) { 
document.write(value); 
}; 
win.println = function(value) { 
print(value); 
document.write("<br/>"); 
}; 
win.each = function(object, callback, args) { 
var name, i = 0, 
length = object.length, 
isObj = (length === undefined || isFunction(object)); 
if (args) { 
if (isObj) { 
for (name in object) { 
if (callback.apply(object[name], args) === false) { 
break; 
} 
} 
} else { 
for (; i < length;) { 
if (callback.apply(object[i++], args) === false) { 
break; 
} 
} 
} 
} else { 
if (isObj) { 
for (name in object) { 
if (callback.call(object[name], name, object[name]) === false) { 
break; 
} 
} 
} else { 
for (; i < length;) { 
if (callback.call(object[i], i, object[i++]) === false) { 
break; 
} 
} 
} 
} 
return object; 
}; 
win.Array.prototype.toString = function(){ 
return "[" + this.join() + "]" 
} 
win.extend = function() { 
var options, 
name, 
src, 
copy, 
copyIsArray, 
clone, 
target = arguments[0] || {}, 
i = 1, 
length = arguments.length, 
deep = false; 
// Handle a deep copy situation 
if ( typeof target === "boolean" ) { 
deep = target; 
target = arguments[1] || {}; 
// skip the boolean and the target 
i = 2; 
} 
// Handle case when target is a string or something (possible in deep copy) 
if ( typeof target !== "object" && !isFunction(target) ) { 
target = {}; 
} 
// extend jQuery itself if only one argument is passed 
if ( length === i ) { 
target = this; 
--i; 
} 
for ( ; i < length; i++ ) { 
// Only deal with non-null/undefined values 
if ( (options = arguments[ i ]) != null ) { 
// Extend the base object 
for ( name in options ) { 
src = target[ name ]; 
copy = options[ name ]; 
// Prevent never-ending loop 
if ( target === copy ) { 
continue; 
} 
// Recurse if we're merging plain objects or arrays 
if ( deep && copy && ( isPlainObject(copy) || (copyIsArray = isArray(copy)) ) ) { 
if ( copyIsArray ) { 
copyIsArray = false; 
clone = src && isArray(src) ? src : []; 
} else { 
clone = src && isPlainObject(src) ? src : {}; 
} 
// Never move original objects, clone them 
target[ name ] = extend( deep, clone, copy ); 
// Don't bring in undefined values 
} else if ( copy !== undefined ) { 
target[ name ] = copy; 
} 
} 
} 
} 
// Return the modified object 
return target; 
}; 
})(window);

如果我们不用extend方法,可以象下面的方式写自己的组件:
(function(win){ 
win.StringBuffer = function(){ 
this.datas = []; 
} 
var proto = StringBuffer.prototype; 
proto.append = function(value){ 
this.datas.push(value); 
}, 
proto.toString = function(){ 
return this.datas.join(""); 
} 
})(window);

如果使用extend方法,可以象下面这样写组件:
(function(win){ 
win.extend(win,{ 
StringBuilder : function(){ 
this.datas = []; 
} 
}); 
win.extend(StringBuilder.prototype, { 
append : function(value){ 
this.datas.push(value); 
}, 
toString : function(){ 
return this.datas.join(""); 
} 
}); 
})(window);

两种方法的效果一样,但是extend方法还可以做更多事件,比如插件式开发,跟第二种方式很象。
当然,如果你本来就想写jQuery插件,那就直接用jQuery的extend就可以啦。
Javascript 相关文章推荐
语义化 H1 标签
Jan 14 Javascript
jQuery中获取Radio元素值的方法
Jul 02 Javascript
当某个文本框成为焦点时即清除文本框内容
Apr 28 Javascript
编写自己的jQuery提示框(Tip)插件
Feb 05 Javascript
浅谈javascript中return语句
Jul 15 Javascript
JS+CSS实现滑动切换tab菜单效果
Aug 25 Javascript
Bootstrap编写导航栏和登陆框
May 30 Javascript
jQuery EasyUI常用数据验证汇总
Sep 18 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
Apr 06 Javascript
web前端vue实现插值文本和输出原始html
Jan 19 Javascript
vue项目使用微信公众号支付总结及遇到的坑
Oct 23 Javascript
JavaScript常见事件处理程序实例总结
Jan 05 Javascript
js不完美解决click和dblclick事件冲突问题
Jul 16 #Javascript
js jquery数组介绍
Jul 15 #Javascript
js限制文本框只能输入数字(正则表达式)
Jul 15 #Javascript
基于jquery的图片幻灯展示源码
Jul 15 #Javascript
20款非常优秀的 jQuery 工具提示插件 推荐
Jul 15 #Javascript
EasyUI 中 MenuButton 的使用方法
Jul 14 #Javascript
为EasyUI的Tab标签添加右键菜单的方法
Jul 14 #Javascript
You might like
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
简单的jquery拖拽排序效果实现代码
2011/09/20 Javascript
Javascript引用指针使用介绍
2012/11/07 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
ComboBox 和 DateField 在IE下消失的解决方法
2013/08/30 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
js实现可旋转的立方体模型
2016/10/16 Javascript
js+css3制作时钟特效
2016/10/16 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
用Node编写RESTful API接口的示例代码
2018/07/04 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
2019/05/20 Javascript
JS实现随机点名器
2020/04/12 Javascript
微信小程序实现发微博功能的示例代码
2020/06/24 Javascript
[59:07]海涛为你详解DOTA2新版本“贤哲秘契”
2014/11/22 DOTA
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
简析Python的闭包和装饰器
2016/02/26 Python
python使用RNN实现文本分类
2018/05/24 Python
Python操作MySQL数据库的示例代码
2020/07/13 Python
详解在Python中使用Torchmoji将文本转换为表情符号
2020/07/27 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
css3动画过渡实现鼠标跟随导航效果
2018/02/08 HTML / CSS
HTML5 语音搜索(淘宝店语音搜素)
2013/01/03 HTML / CSS
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
应届毕业生的个人自我鉴定
2013/10/24 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
企业金融服务方案
2014/06/03 职场文书
社团活动总结怎么写
2014/06/30 职场文书
党员一帮一活动总结
2014/07/08 职场文书
实习生辞职信范文
2015/03/02 职场文书
电影地道战观后感
2015/06/04 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
Win10开机修复磁盘错误怎么跳过?Win10关闭开机磁盘检查的方法
2022/09/23 数码科技