(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("
"); }; 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
如果我们不用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就可以啦。