【JavaScript】创建命名空间,Class,LOG
- JxUnderscore(function (J, _, root) {
- var isWindow,
- deepObject,
- Namespace,
- Class,
- LOG;
- /**
- * 一个对象是否为window对象
- * @param obj
- * @returns {boolean}
- */
- isWindow = function (obj) {
- return !!obj && obj.window === window;
- };
- /**
- * 用于打印日志的方法
- */
- LOG = (function () {
- if (isWindow(root)) {
- if (!!window.console) {
- return {
- error: function (s) {
- window.console.log("[error]" + s);
- },
- debug: function () {
- window.console.log("[debug]" + s);
- }
- };
- } else {
- return {
- error: function (s) {
- window.alert(s)
- },
- debug: function () {
- }
- }
- }
- } else {
- return {
- error: function () {
- },
- debug: function () {
- }
- };
- }
- })();
- /**
- * 创建/获取一个命名空间/包
- * @param namespacePath
- * @param context
- * @returns {*}
- */
- deepObject = function (namespacePath, context) {
- if ("string" !== typeof namespacePath) {
- return undefined;
- }
- var ns = context || root;
- var pathArr = namespacePath.split('.');
- for (var i = 0; i < pathArr.length; i++) {
- var path = pathArr[i];
- ns[path] = ns[path] || {};
- ns = ns[path];
- }
- return ns;
- };
- /**
- * 创建Class类的类
- * Class
- * @class
- * @memberOf Jx
- * @param {Object} option = {extend: superClass} 在option对象的extend属性中指定要继承的对象,可以不写
- * @param {Object} object 扩展的对象
- * @return {Object} Class类
- *
- * @example
- *
- * var Person = new J.Class({
- * init : function(name){
- * this.name = name;
- * alert("init");
- * },
- * showName : function(){
- * alert(this.name);
- *
- * }
- *
- *
- *
- * // 继承Person
- * var Person2 = new J.Class({extend : Person}, {
- * init : function(name){
- * this.name = name;
- * alert("init");
- * },
- * showName : function(){
- * alert(this.name);
- *
- * }
- *
- * });
- *
- * };
- *
- */
- Class = function () {
- var length = arguments.length;
- var option = arguments[length - 1];
- option.init = option.init || function () {
- };
- // 如果参数中有要继承的父类
- if (length === 2) {
- /**
- * @ignore
- */
- var superClass = arguments[0].extend;
- /**
- * @ignore
- */
- var tempClass = function () {
- };
- tempClass.prototype = superClass.prototype;
- /**
- * @ignore
- */
- var subClass = function () {
- this.init.apply(this, arguments);
- };
- // 加一个对父类原型引用的静态属性
- subClass.superClass = superClass.prototype;
- //subClass.superClass = superClass;
- /**
- * @ignore
- */
- subClass.callSuper = function (context, func) {
- var slice = Array.prototype.slice;
- var a = slice.call(arguments, 2);
- var func = subClass.superClass[func];
- //var func = subClass.superClass.prototype[func];
- if (func) {
- func.apply(context, a.concat(slice.call(arguments)));
- }
- };
- // 指定原型
- subClass.prototype = new tempClass();
- // 重新指定构造函数
- subClass.prototype.constructor = subClass;
- _.extend(subClass.prototype, option);
- /**
- * @ignore
- */
- subClass.prototype.init = function () {
- // 调用父类的构造函数
- // subClass.superClass.init.apply(this, arguments);
- // 调用此类自身的构造函数
- option.init.apply(this, arguments);
- };
- return subClass;
- // 如果参数中没有父类,则单纯构建一个类
- } else if (length === 1) {
- /**
- * @ignore
- */
- var newClass = function () {
- // 加了return,否则init返回的对象不生效
- return this.init.apply(this, arguments);
- };
- newClass.prototype = option;
- return newClass;
- }
- };
- /**
- * 创建/获取一个命名空间/包
- * @param {String} namespacePath
- * @param {function} workspace
- * @constructor
- * @example
- * J.Namespace("jx.ui.pm",function(pm){
- * return {
- * a:"a",
- * b:"b"
- * }
- * });
- * J.Package("jx.ui.pm",function(pm){
- * var a=pm.a;
- * return {
- * c:"c"+a,
- * d:"d"
- * };
- * });
- */
- Namespace = function (namespacePath, workspace) {
- namespacePath = namespacePath || "";
- workspace = workspace || function () {
- };
- var namespaceObj = deepObject(namespacePath);
- if (namespaceObj) {
- var result = workspace(namespaceObj);
- if (_.isObject(result)) {
- _.extend(namespaceObj, result);
- } else {
- LOG.error("the return value is not an object,namespace :" + namespacePath);
- }
- }
- };
- J.Namespace = Namespace;
- J.Package = Namespace;
- J.Class = Class;
- J.isWindow = isWindow;
- J.createDeepObject = deepObject;
- J.LOG = LOG;
- return {
- Namespace: Namespace,
- Package: Namespace,
- Class: Class,
- isWindow: isWindow,
- createDeepObject: deepObject,
- LOG: LOG
- };
- });
【JavaScript】创建命名空间,Class,LOG的更多相关文章
- JavaScript创建命名空间、类及类成员
JavaScript代码: //为String对象增加方法isNullOrEmpty String.isNullOrEmpty = function (a) { if (a != null & ...
- JavaScript中创建命名空间
引用:http://ourjs.com/detail/538d8d024929582e6200000c 在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺 ...
- 在JavaScript中创建命名空间的几种写法
在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子: var sayHello = function() { return 'Hel ...
- javascript创建css、js,onload触发callback兼容主流浏览器的实现
http://www.fantxi.com/blog/archives/load-css-js-callback/ 由于需要写个函数,既可以加载css,又可以加载js,所以对各主流浏览器对加载js.c ...
- JavaScript 实现命名空间(namespace)的最佳方案——兼容主流的定义类(class)的方法,兼容所有浏览器,支持用JSDuck生成文档
作者: zyl910 一.缘由 在很多的面向对象编程语言中,我们可以使用命名空间(namespace)来组织代码,避免全局变量污染.命名冲突.遗憾的是,JavaScript中并不提供对命名空间的原生支 ...
- js中创建命名空间的几种写法
在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子: var sayHello = function() { return 'Hel ...
- JavaScript创建块级作用域
1.JavaScript创建块级作用域 (1)方法一:ES6 (2)方法二:闭包 2.示例 <!DOCTYPE html> <html lang="zh"> ...
- 在js中创建命名空间的几种写法
在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子: var sayHello = function() { return 'H ...
- 用html5的canvas和JavaScript创建一个绘图程序
本文将引导你使用canvas和JavaScript创建一个简单的绘图程序. 创建canvas元素 首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面. <canvas ...
- javascript 中的console.log和弹出窗口alert
主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是: 他能看到结构话的东西,如果是alert,淡出一个对象就是[object object],但是co ...
随机推荐
- js获取客户端操作系统
function detectOS() { var sUserAgent = navigator.userAgent; var isWin = (navigator.platform == " ...
- Unity. Navigation和寻路
Navigation Static:不会移动.可以用于计算可行走区域.例如:地板.墙.静态障碍物. 将一个物体选为Navigation Static:Navigation窗口-> 勾选项
- Mysql源码目录结构
Programs for handling SQL commands. The "core" of MySQL. These are the .c and .cc files in ...
- MySQLdb
MySQLdb的使用 #mysql> create table `account`( # -> `acctid` int(11) default null comment 'XXXX', ...
- Oracle数据库—— 事务处理与并发控制
一.涉及内容 1.理解事务的概念和几个特性. 2.熟练掌握事务管理命令的使用. 3.理解并发操作的概念和数据库锁的类型. 二.具体操作 (12.5 实验) 1. 分析以下代码,说出代码中的哪些部分体现 ...
- 虚拟化之vmware-网络
http://blog.sina.com.cn/s/blog_6b89db7a01012jtw.htmlESXI 5.0 虚拟机的网络适配器兼容性列表 就需要在vSphere标准交换机(vSphere ...
- 查询oracle RAC实例名称等信息
select * from gv$instance;
- Mdrill:来自阿里的多维快速查询工具
mdrill是阿里妈妈-adhoc-海量数据多维自助即席查询平台下的一个子项目.旨在帮助用户在几秒到几十秒的时间内,分析百亿级别的任意维度组合的数据.mdrill是一个分布式的在线分析查询系统,基于h ...
- ASP.NET MVC3升级到ASP.NET MVC4 的方法
ASP.NET MVC3升级 ASP.NET MVC4 的方法: 1.先去掉引用的System.Web.Mvc.dll(MVC3版本),重新引入System.Web.Mvc.dll(MVC4版本) 2 ...
- 别样的checkbox
<style type="text/css"> input[type=checkbox] { visibility: hidden; } .slide_check_bo ...