【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 ...
随机推荐
- poj1094 拓扑序
题意:现在有多个大写字母(不一定连续),给出字母之间的大小关系,问到第几个关系时就能判断有唯一大小排序或出现矛盾,或是有多个合理排序,若有唯一排序,则输出它. 拓扑序,只不过坑爹的是如果关系处理到一半 ...
- C语言指针与数组的定义与声明易错分析
部分摘自<C语言深度解剖> 1.定义为数组,声明为指针 在文件1中定义: char a[100]; 在文件2中声明: extern char *a; //这样是错误的 这里的extern告 ...
- 论文笔记之:Visual Tracking with Fully Convolutional Networks
论文笔记之:Visual Tracking with Fully Convolutional Networks ICCV 2015 CUHK 本文利用 FCN 来做跟踪问题,但开篇就提到并非将其看做 ...
- freeswitch 挂断前执行脚本
通道变量名 api_hangup_hook 介绍在挂断时执行指定API命令 示例 <action application="set" data="api_hangu ...
- memcached +mysql+php 测试例子
最近看了看memcached 缓存 mysql,经过一段时间的研究·把自己测试方法写出来,给像我一样的初学者用~我的环境是 nginx + php-fpm + apc + mysql 编译安装memc ...
- nginx配置-http和https
#user nobody;worker_processes 1;error_log logs/error.log;#error_log logs/error.log notice;#error_log ...
- nginx实现日志按天切割
背景 nginx的日志文件没有rotate功能.一段时间过后,日志将越发臃肿,一个accesslog很快就突破1G,因此有必要通过脚本实现按天切割日志. 解决思路 1 重命名日志文件,如更改为acc ...
- linux终端-console
echo $TERM 在ssh上是xterm 在console上是linux setterm -foreground black -background white -store http://blo ...
- kubernetes集群部署
鉴于Docker如此火爆,Google推出kubernetes管理docker集群,不少人估计会进行尝试.kubernetes得到了很多大公司的支持,kubernetes集群部署工具也集成了gce,c ...
- 常用邮件 smtp pop
常用的邮箱服务器(SMTP.POP3)地址.端口 sina.com: POP3服务器地址:pop3.sina.com.cn(端口:110) SMTP服务器地址:smtp.sina.com.cn(端口 ...