作者: 铁锚
日期: 2013年12月19日
说明: 本系列文章为草稿,等待后期完善。源码是jQuery版本的,code.photoswipe-3.0.5.js
1. 代码开头,就是一些版权申明,没什么好说的,MIT授权。
// Copyright (c) 2012 by Code Computerlove (http://www.codecomputerlove.com) // Licensed under the MIT license // version: 3.0.5
(function (window) { // 代码区域 // Function.prototype.bind 函数绑定 部分 // window.Code.Util 部分 }(window));说明: 如果要在自己的代码环境中将 window 指代为全局window,只有采用函数参数的形式,如果 直接 var window = xxx;将会报语法错误。
3. 对 Function 函数定义类的hack,如果没有bind原型方法则用自定义的方法来实现:
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind if (!Function.prototype.bind ) { Function.prototype.bind = function( obj ) { var slice = [].slice, args = slice.call(arguments, 1), self = this, nop = function () {}, bound = function () { return self.apply( this instanceof nop ? this : ( obj || {} ), args.concat( slice.call(arguments) ) ); }; nop.prototype = self.prototype; bound.prototype = new nop(); return bound; }; }4. 接下来是window.Code工具类的封装:
if (typeof window.Code === "undefined") { window.Code = {}; } window.Code.Util = { /* * Function: registerNamespace */ registerNamespace: function () { var args = arguments, obj = null, i, j, ns, nsParts, root, argsLen, nsPartsLens; for (i=0, argsLen=args.length; i<argsLen; i++) { ns = args[i]; nsParts = ns.split("."); root = nsParts[0]; if (typeof window[root] === "undefined"){ window[root] = {}; } obj = window[root]; //eval('if (typeof ' + root + ' == "undefined"){' + root + ' = {};} obj = ' + root + ';'); for (j=1, nsPartsLens=nsParts.length; j<nsPartsLens; ++j) { obj[nsParts[j]] = obj[nsParts[j]] || {}; obj = obj[nsParts[j]]; } } }, /* * Function: coalesce * Takes any number of arguments and returns the first non Null / Undefined argument. */ coalesce: function () { var i, j; for (i=0, j=arguments.length; i<j; i++) { if (!this.isNothing(arguments[i])) { return arguments[i]; } } return null; }, /* * Function: extend */ extend: function(destination, source, overwriteProperties){ var prop; if (this.isNothing(overwriteProperties)){ overwriteProperties = true; } if (destination && source && this.isObject(source)){ for(prop in source){ if (this.objectHasProperty(source, prop)) { if (overwriteProperties){ destination[prop] = source[prop]; } else{ if(typeof destination[prop] === "undefined"){ destination[prop] = source[prop]; } } } } } }, /* * Function: clone */ clone: function(obj) { var retval = {}; this.extend(retval, obj); return retval; }, /* * Function: isObject */ isObject: function(obj){ return obj instanceof Object; }, /* * Function: isFunction */ isFunction: function(obj){ return ({}).toString.call(obj) === "[object Function]"; }, /* * Function: isArray */ isArray: function(obj){ return obj instanceof Array; }, /* * Function: isLikeArray */ isLikeArray: function(obj) { return typeof obj.length === 'number'; }, /* * Function: isNumber */ isNumber: function(obj){ return typeof obj === "number"; }, /* * Function: isString */ isString: function(obj){ return typeof obj === "string"; }, /* * Function: isNothing */ isNothing: function (obj) { if (typeof obj === "undefined" || obj === null) { return true; } return false; }, /* * Function: swapArrayElements */ swapArrayElements: function(arr, i, j){ var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }, /* * Function: trim */ trim: function(val) { return val.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); }, /* * Function: toCamelCase */ toCamelCase: function(val){ return val.replace(/(\-[a-z])/g, function($1){return $1.toUpperCase().replace('-','');}); }, /* * Function: toDashedCase */ toDashedCase: function(val){ return val.replace(/([A-Z])/g, function($1){return "-"+$1.toLowerCase();}); }, /* * Function: indexOf */ arrayIndexOf: function(obj, array, prop){ var i, j, retval, arrayItem; retval = -1; for (i=0, j=array.length; i<j; i++){ arrayItem = array[i]; if (!this.isNothing(prop)){ if (this.objectHasProperty(arrayItem, prop)) { if (arrayItem[prop] === obj){ retval = i; break; } } } else{ if (arrayItem === obj){ retval = i; break; } } } return retval; }, /* * Function: objectHasProperty */ objectHasProperty: function(obj, propName){ if (obj.hasOwnProperty){ return obj.hasOwnProperty(propName); } else{ return ('undefined' !== typeof obj[propName]); } } };内部是一些需要使用到的工具函数.