写自已的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 相关文章推荐
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)
Jul 04 Javascript
分享一个asp.net pager分页控件
Jan 04 Javascript
jquery ajax修改全局变量示例代码
Nov 08 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
Jan 23 Javascript
三种带箭头提示框总结实例
Jun 14 Javascript
如何提高javascript加载速度
Dec 26 Javascript
详解Python中logging日志模块在多进程环境下的使用
Dec 26 Javascript
vue axios 表单提交上传图片的实例
Mar 16 Javascript
React 无状态组件(Stateless Component) 与高阶组件
Aug 14 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
Sep 01 Javascript
原生js实现移动端Touch轮播图的方法步骤
Jan 03 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
Apr 11 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
php模拟asp中的XmlHttpRequest实现http请求的代码
2011/03/24 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
datagrid框架的删除添加与修改
2013/04/08 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
浅谈VUE单页应用首屏加载速度优化方案
2018/08/28 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
vue离开当前页面触发的函数代码
2020/09/01 Javascript
Python处理文本文件中控制字符的方法
2017/02/07 Python
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
Python字符串格式化的方法(两种)
2017/09/19 Python
深入flask之异步非堵塞实现代码示例
2018/07/31 Python
Python列表与元组的异同详解
2019/07/02 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
Python3 搭建Qt5 环境的方法示例
2020/07/16 Python
Python高并发和多线程有什么关系
2020/11/14 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
2021/01/27 Python
几个解决兼容IE6\7\8不支持html5标签的几个方法
2013/01/07 HTML / CSS
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
德国综合购物网站:OTTO
2018/11/13 全球购物
卫校毕业生个人自我鉴定
2014/04/28 职场文书
简洁的英文求职信范文
2014/05/03 职场文书
酒店开业策划方案
2014/06/02 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
活动费用申请报告
2015/05/15 职场文书
车间安全生产管理制度
2015/08/06 职场文书
Python查找算法的实现 (线性、二分,分块、插值查找算法)
2022/04/24 Python