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

所属分类: 网络编程 / JavaScript 阅读数: 707
收藏 0 赞 0 分享
复制代码 代码如下:

(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就可以啦。
更多精彩内容其他人还在看

jQuery LigerUI 使用教程表格篇(1)

ligerGrid是ligerui系列插件的核心控件,用户可以快速地创建一个美观,而且功能强大的表格,支持排序、分页、多表头、固定列等等
收藏 0 赞 0 分享

JavaScript中常用的运算符小结

JavaScript中常用的运算符小结,需要的朋友可以参考下。
收藏 0 赞 0 分享

深入理解JavaScript系列(13) This? Yes,this!

在这篇文章里,我们将讨论跟执行上下文直接相关的更多细节。讨论的主题就是this关键字。实践证明,这个主题很难,在不同执行上下文中this的确定经常会发生问题
收藏 0 赞 0 分享

javascript (用setTimeout而非setInterval)

javascript (用setTimeout而非setInterval)如果用setInterval 可能出现 下次调用会在前一次调用前调用
收藏 0 赞 0 分享

JavaScript中两个感叹号的作用说明

用两个感叹号的作用就在于,如果明确设置了o中flag的值(非null/undefined/0""/等值),自然test就会取跟o.flag一样的值;如果没有设置,test就会默认为false,而不是null或undefined
收藏 0 赞 0 分享

javascript写的简单的计算器,内容很多,方法实用,推荐

最近用javascript写了一个简单的计算器,自己测试感觉还好,代码都给了注释,非常不错,推荐大家学习。
收藏 0 赞 0 分享

js的表单操作 简单计算器

javascript写的简单的加减乘除计算器,里面涉及到一些方法还是很实用的哦,新手不要错过
收藏 0 赞 0 分享

Jquery中删除元素的实现代码

empty用来删除指定元素的子元素,remove用来删除元素,或者设定细化条件执行删除
收藏 0 赞 0 分享

javaScript 利用闭包模拟对象的私有属性

JavaScript缺少块级作用域,没有private修饰符,但它具有函数作用域。作用域的好处是内部函数可以访问它们的外部函数的参数和变量(除了this和argument
收藏 0 赞 0 分享

为JavaScript类型增加方法的实现代码(增加功能)

大家在js开发过程中有些功能已经满足不了我们的需求,或没有我们需要的功能,那么我们就可以自己扩展下,个性化js
收藏 0 赞 0 分享
查看更多