写自已的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 相关文章推荐
JavaScript实现Sleep函数的代码
Mar 04 Javascript
Dom 学习总结以及实例的使用介绍
Apr 24 Javascript
程序员必知35个jQuery 代码片段
Nov 05 Javascript
jQuery实现放大镜效果实例代码
Mar 17 Javascript
完美实现八种js焦点轮播图(上篇)
Jul 18 Javascript
ECMAScript6轮播图实践知识总结
Aug 17 Javascript
Bootstrap提示框效果的实例代码
Jul 12 Javascript
JavaScript new对象的四个过程实例浅析
Jul 31 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
Dec 23 Javascript
微信小程序中为什么使用var that=this
Aug 27 Javascript
Vue实现数据请求拦截
Oct 23 Javascript
Javascript的promise,async和await的区别详解
Mar 24 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模板中出现空行解决方法
2011/03/08 PHP
PHP中使用cURL实现Get和Post请求的方法
2013/03/13 PHP
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
2016/01/22 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
PHP registerXPathNamespace()函数讲解
2019/02/03 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
2019/07/20 PHP
Jquery Change与bind事件代码
2011/09/29 Javascript
js判断数据类型如判断是否为数组是否为字符串等等
2014/01/15 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
jquery常用函数与方法汇总
2015/09/01 Javascript
js实现新浪微博首页效果
2015/10/16 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
2015/12/28 Javascript
jQuery Validation Plugin验证插件手动验证
2016/01/26 Javascript
JavaScript数据结构与算法之链表
2016/01/29 Javascript
购物车前端开发(jQuery和bootstrap3)
2016/08/27 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
JS解析url查询参数的简单代码
2017/08/06 Javascript
详解webpack 入门与解析
2018/04/09 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
2019/03/29 Javascript
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
wxPython的安装与使用教程
2018/08/31 Python
python实现图片彩色转化为素描
2019/01/15 Python
详解Python 切片语法
2019/06/10 Python
在cmd中查看python的安装路径方法
2019/07/03 Python
wxPython多个窗口的基本结构
2019/11/19 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
数据库面试要点基本概念
2013/10/31 面试题
上班离岗检讨书
2014/01/27 职场文书
2015年普法依法治理工作总结
2015/05/26 职场文书