1. JxUnderscore(function (J, _, root) {
  2.  
  3. var isWindow,
  4. deepObject,
  5. Namespace,
  6. Class,
  7. LOG;
  8.  
  9. /**
  10. * 一个对象是否为window对象
  11. * @param obj
  12. * @returns {boolean}
  13. */
  14. isWindow = function (obj) {
  15. return !!obj && obj.window === window;
  16. };
  17.  
  18. /**
  19. * 用于打印日志的方法
  20. */
  21. LOG = (function () {
  22. if (isWindow(root)) {
  23. if (!!window.console) {
  24. return {
  25. error: function (s) {
  26. window.console.log("[error]" + s);
  27. },
  28. debug: function () {
  29. window.console.log("[debug]" + s);
  30. }
  31. };
  32. } else {
  33. return {
  34. error: function (s) {
  35. window.alert(s)
  36. },
  37. debug: function () {
  38. }
  39. }
  40. }
  41. } else {
  42. return {
  43. error: function () {
  44. },
  45. debug: function () {
  46. }
  47. };
  48. }
  49. })();
  50.  
  51. /**
  52. * 创建/获取一个命名空间/包
  53. * @param namespacePath
  54. * @param context
  55. * @returns {*}
  56. */
  57. deepObject = function (namespacePath, context) {
  58. if ("string" !== typeof namespacePath) {
  59. return undefined;
  60. }
  61. var ns = context || root;
  62. var pathArr = namespacePath.split('.');
  63. for (var i = 0; i < pathArr.length; i++) {
  64. var path = pathArr[i];
  65. ns[path] = ns[path] || {};
  66. ns = ns[path];
  67. }
  68. return ns;
  69. };
  70.  
  71. /**
  72. * 创建Class类的类
  73. * Class
  74. * @class
  75. * @memberOf Jx
  76. * @param {Object} option = {extend: superClass} 在option对象的extend属性中指定要继承的对象,可以不写
  77. * @param {Object} object 扩展的对象
  78. * @return {Object} Class类
  79. *
  80. * @example
  81. *
  82. * var Person = new J.Class({
  83. * init : function(name){
  84. * this.name = name;
  85. * alert("init");
  86. * },
  87. * showName : function(){
  88. * alert(this.name);
  89. *
  90. * }
  91. *
  92. *
  93. *
  94. * // 继承Person
  95. * var Person2 = new J.Class({extend : Person}, {
  96. * init : function(name){
  97. * this.name = name;
  98. * alert("init");
  99. * },
  100. * showName : function(){
  101. * alert(this.name);
  102. *
  103. * }
  104. *
  105. * });
  106. *
  107. * };
  108. *
  109. */
  110. Class = function () {
  111. var length = arguments.length;
  112. var option = arguments[length - 1];
  113.  
  114. option.init = option.init || function () {
  115. };
  116.  
  117. // 如果参数中有要继承的父类
  118. if (length === 2) {
  119. /**
  120. * @ignore
  121. */
  122. var superClass = arguments[0].extend;
  123.  
  124. /**
  125. * @ignore
  126. */
  127. var tempClass = function () {
  128. };
  129. tempClass.prototype = superClass.prototype;
  130.  
  131. /**
  132. * @ignore
  133. */
  134. var subClass = function () {
  135. this.init.apply(this, arguments);
  136. };
  137.  
  138. // 加一个对父类原型引用的静态属性
  139. subClass.superClass = superClass.prototype;
  140. //subClass.superClass = superClass;
  141. /**
  142. * @ignore
  143. */
  144. subClass.callSuper = function (context, func) {
  145. var slice = Array.prototype.slice;
  146. var a = slice.call(arguments, 2);
  147. var func = subClass.superClass[func];
  148. //var func = subClass.superClass.prototype[func];
  149. if (func) {
  150. func.apply(context, a.concat(slice.call(arguments)));
  151. }
  152. };
  153.  
  154. // 指定原型
  155. subClass.prototype = new tempClass();
  156.  
  157. // 重新指定构造函数
  158. subClass.prototype.constructor = subClass;
  159.  
  160. _.extend(subClass.prototype, option);
  161.  
  162. /**
  163. * @ignore
  164. */
  165. subClass.prototype.init = function () {
  166. // 调用父类的构造函数
  167. // subClass.superClass.init.apply(this, arguments);
  168. // 调用此类自身的构造函数
  169. option.init.apply(this, arguments);
  170. };
  171.  
  172. return subClass;
  173.  
  174. // 如果参数中没有父类,则单纯构建一个类
  175. } else if (length === 1) {
  176. /**
  177. * @ignore
  178. */
  179. var newClass = function () {
  180. // 加了return,否则init返回的对象不生效
  181. return this.init.apply(this, arguments);
  182. };
  183. newClass.prototype = option;
  184. return newClass;
  185. }
  186.  
  187. };
  188.  
  189. /**
  190. * 创建/获取一个命名空间/包
  191. * @param {String} namespacePath
  192. * @param {function} workspace
  193. * @constructor
  194. * @example
  195. * J.Namespace("jx.ui.pm",function(pm){
  196. * return {
  197. * a:"a",
  198. * b:"b"
  199. * }
  200. * });
  201. * J.Package("jx.ui.pm",function(pm){
  202. * var a=pm.a;
  203. * return {
  204. * c:"c"+a,
  205. * d:"d"
  206. * };
  207. * });
  208. */
  209. Namespace = function (namespacePath, workspace) {
  210. namespacePath = namespacePath || "";
  211. workspace = workspace || function () {
  212. };
  213. var namespaceObj = deepObject(namespacePath);
  214. if (namespaceObj) {
  215. var result = workspace(namespaceObj);
  216. if (_.isObject(result)) {
  217. _.extend(namespaceObj, result);
  218. } else {
  219. LOG.error("the return value is not an object,namespace :" + namespacePath);
  220. }
  221. }
  222. };
  223.  
  224. J.Namespace = Namespace;
  225.  
  226. J.Package = Namespace;
  227.  
  228. J.Class = Class;
  229.  
  230. J.isWindow = isWindow;
  231.  
  232. J.createDeepObject = deepObject;
  233.  
  234. J.LOG = LOG;
  235.  
  236. return {
  237. Namespace: Namespace,
  238. Package: Namespace,
  239. Class: Class,
  240. isWindow: isWindow,
  241. createDeepObject: deepObject,
  242. LOG: LOG
  243. };
  244.  
  245. });

  

【JavaScript】创建命名空间,Class,LOG的更多相关文章

  1. JavaScript创建命名空间、类及类成员

    JavaScript代码: //为String对象增加方法isNullOrEmpty String.isNullOrEmpty = function (a) { if (a != null & ...

  2. JavaScript中创建命名空间

    引用:http://ourjs.com/detail/538d8d024929582e6200000c   在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺 ...

  3. 在JavaScript中创建命名空间的几种写法

    在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子: var sayHello = function() { return 'Hel ...

  4. javascript创建css、js,onload触发callback兼容主流浏览器的实现

    http://www.fantxi.com/blog/archives/load-css-js-callback/ 由于需要写个函数,既可以加载css,又可以加载js,所以对各主流浏览器对加载js.c ...

  5. JavaScript 实现命名空间(namespace)的最佳方案——兼容主流的定义类(class)的方法,兼容所有浏览器,支持用JSDuck生成文档

    作者: zyl910 一.缘由 在很多的面向对象编程语言中,我们可以使用命名空间(namespace)来组织代码,避免全局变量污染.命名冲突.遗憾的是,JavaScript中并不提供对命名空间的原生支 ...

  6. js中创建命名空间的几种写法

    在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子: var sayHello = function() { return 'Hel ...

  7. JavaScript创建块级作用域

    1.JavaScript创建块级作用域 (1)方法一:ES6 (2)方法二:闭包 2.示例 <!DOCTYPE html> <html lang="zh"> ...

  8. 在js中创建命名空间的几种写法

    在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子:   var sayHello = function() { return 'H ...

  9. 用html5的canvas和JavaScript创建一个绘图程序

    本文将引导你使用canvas和JavaScript创建一个简单的绘图程序. 创建canvas元素 首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面. <canvas ...

  10. javascript 中的console.log和弹出窗口alert

    主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是: 他能看到结构话的东西,如果是alert,淡出一个对象就是[object object],但是co ...

随机推荐

  1. js获取客户端操作系统

    function detectOS() { var sUserAgent = navigator.userAgent; var isWin = (navigator.platform == " ...

  2. Unity. Navigation和寻路

    Navigation Static:不会移动.可以用于计算可行走区域.例如:地板.墙.静态障碍物. 将一个物体选为Navigation Static:Navigation窗口-> 勾选项

  3. Mysql源码目录结构

    Programs for handling SQL commands. The "core" of MySQL. These are the .c and .cc files in ...

  4. MySQLdb

    MySQLdb的使用 #mysql> create table `account`( # -> `acctid` int(11) default null comment 'XXXX', ...

  5. Oracle数据库—— 事务处理与并发控制

    一.涉及内容 1.理解事务的概念和几个特性. 2.熟练掌握事务管理命令的使用. 3.理解并发操作的概念和数据库锁的类型. 二.具体操作 (12.5 实验) 1. 分析以下代码,说出代码中的哪些部分体现 ...

  6. 虚拟化之vmware-网络

    http://blog.sina.com.cn/s/blog_6b89db7a01012jtw.htmlESXI 5.0 虚拟机的网络适配器兼容性列表 就需要在vSphere标准交换机(vSphere ...

  7. 查询oracle RAC实例名称等信息

    select * from gv$instance;

  8. Mdrill:来自阿里的多维快速查询工具

    mdrill是阿里妈妈-adhoc-海量数据多维自助即席查询平台下的一个子项目.旨在帮助用户在几秒到几十秒的时间内,分析百亿级别的任意维度组合的数据.mdrill是一个分布式的在线分析查询系统,基于h ...

  9. ASP.NET MVC3升级到ASP.NET MVC4 的方法

    ASP.NET MVC3升级 ASP.NET MVC4 的方法: 1.先去掉引用的System.Web.Mvc.dll(MVC3版本),重新引入System.Web.Mvc.dll(MVC4版本) 2 ...

  10. 别样的checkbox

    <style type="text/css"> input[type=checkbox] { visibility: hidden; } .slide_check_bo ...