寫(xiě)自已的js類庫(kù)需要的核心代碼
更新時(shí)間:2012年07月16日 01:22:19 作者:
眾所周知,用jQuery的extend方法,可以很方便的實(shí)現(xiàn)繼承和對(duì)象拷貝,我們可以把它拿過(guò)來(lái)自己用
復(fù)制代碼 代碼如下:
(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方法,可以象下面的方式寫(xiě)自己的組件:
復(fù)制代碼 代碼如下:
(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方法,可以象下面這樣寫(xiě)組件:
復(fù)制代碼 代碼如下:
(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方法還可以做更多事件,比如插件式開(kāi)發(fā),跟第二種方式很象。
當(dāng)然,如果你本來(lái)就想寫(xiě)jQuery插件,那就直接用jQuery的extend就可以啦。
您可能感興趣的文章:
- 一實(shí)用的實(shí)現(xiàn)table排序的Javascript類庫(kù)
- javascript拖拽上傳類庫(kù)DropzoneJS使用方法
- JavaScript人臉識(shí)別技術(shù)及臉部識(shí)別JavaScript類庫(kù)Tracking.js
- 5個(gè)最佳的Javascript日期處理類庫(kù)分享
- stream.js 一個(gè)很小、完全獨(dú)立的Javascript類庫(kù)
- 用js小類庫(kù)獲取瀏覽器的高度和寬度信息
- ECMAScript 創(chuàng)建自己的js類庫(kù)
- js插件類庫(kù)組織與管理(基于asp.net管理)
- JavaScript 應(yīng)用類庫(kù)代碼
- JS開(kāi)發(fā)自己的類庫(kù)實(shí)例分析
相關(guān)文章
JavaScript面向?qū)ο蟪绦蛟O(shè)計(jì)三 原型模式(上)
在javaScript面向?qū)ο笤O(shè)計(jì)一和Javascript面向?qū)ο笤O(shè)計(jì)二中分別介紹了工廠模式和構(gòu)造函數(shù)模式,以及他們格式的優(yōu)缺點(diǎn),今天繼續(xù)講解原型模式2011-12-12
JavaScript 類型的包裝對(duì)象(Typed Wrappers)
JavaScript 有一套類型的包裝對(duì)象,需要的朋友可以參考下。2011-10-10
JavaScript 工具庫(kù) Cloudgamer JavaScript Library v0.1 發(fā)布
研究了一年多的js,也差不多寫(xiě)一個(gè)自己的js庫(kù)了。 我寫(xiě)這個(gè)不算框架,只是一個(gè)小型的js工具庫(kù),所以我用的名字是Library。2009-10-10
JavaScript 設(shè)計(jì)模式 安全沙箱模式
沙箱模式常見(jiàn)于YUI3 core,它是一種采用同一構(gòu)造器(Constructor)生成彼此獨(dú)立且互不干擾(self-contained)的實(shí)例對(duì)象,而從避免污染全局對(duì)象的方法2010-09-09
討論javascript(一)工廠方式 js面象對(duì)象的定義方法
看《javascript高級(jí)程序設(shè)計(jì)》有感2009-12-12
mapper--圖片熱點(diǎn)區(qū)域高亮組件官方站點(diǎn)
2007-12-12
js定義對(duì)象簡(jiǎn)單學(xué)習(xí)例子
js定義對(duì)象簡(jiǎn)單學(xué)習(xí)例子...2007-09-09

