写自已的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 相关文章推荐
pjblog中的UBBCode.js
Apr 25 Javascript
用CSS+JS实现的进度条效果效果
Jun 05 Javascript
JS+CSS实现精美的二级导航效果代码
Sep 17 Javascript
jQuery获取cookie值及删除cookie用法实例
Apr 15 Javascript
浅析Angular2子模块以及异步加载
Apr 24 Javascript
JavaScript实现三级联动菜单实例代码
Jun 26 Javascript
vue里的data要用return返回的原因浅析
May 28 Javascript
解决layui弹出层layer的area过大被遮挡的问题
Sep 21 Javascript
webpack的pitching loader详解
Sep 23 Javascript
JavaScript适配器模式原理与用法实例详解
Mar 09 Javascript
JS实现页面鼠标点击出现图片特效
Aug 19 Javascript
vue.js 使用原生js实现轮播图
Apr 26 Vue.js
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
PHILIPS L4X25T电路分析和打理
2021/03/02 无线电
Drupal7中常用的数据库操作实例
2014/03/02 PHP
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
Laravel中的Blade模板引擎示例详解
2017/10/10 PHP
js打印纸函数代码(递归)
2010/06/18 Javascript
js 走马灯简单实例
2013/11/21 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
2020/03/07 Javascript
vue-router为激活的路由设置样式操作
2020/07/18 Javascript
编写v-for循环的技巧汇总
2020/12/01 Javascript
[57:50]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第二局
2016/03/05 DOTA
pycharm 使用心得(二)设置字体大小
2014/06/05 Python
python服务器端收发请求的实现代码
2014/09/29 Python
Django中处理出错页面的方法
2015/07/15 Python
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
Python中使用多进程来实现并行处理的方法小结
2017/08/09 Python
python+pillow绘制矩阵盖尔圆简单实例
2018/01/16 Python
python实现二级登陆菜单及安装过程
2019/06/21 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
2016/12/03 HTML / CSS
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
印尼披萨外送专家:Domino’s Pizza印尼
2017/12/28 全球购物
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
台湾三立电视电商平台:电电购
2019/09/09 全球购物
员工培训心得体会
2013/12/30 职场文书
初一学生评语大全
2014/04/24 职场文书
实习评语大全
2014/04/26 职场文书
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis
JS中如何优雅的使用async await详解
2021/10/05 Javascript
python通过新建环境安装tfx的问题
2022/05/20 Python