【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 ...
随机推荐
- Java——银行业务调度系统
需求: 模拟实现银行业务调度系统逻辑,具体需求如下: Ø 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口. Ø 有三种对应类型的客户:VIP客户,普通 ...
- linux下删除所有.svn目录
linux下删除所有.svn目录方法为 find . -type d -name ".svn"|xargs rm -rf 或者 find . -type d -i ...
- HTTPS-透彻学习汇总
SSL和SSH和OpenSSH,OpenSSL有什么区别 一.SSL的作用 不使用SSL/TLS的HTTP通信,就是不加密的通信.所有信息明文传播,带来了三大风险. 窃听风险(eavesdroppin ...
- Linux-Nginx之sendfile与上下文切换
今天在看nginx thread pool的时候,频繁的看到sendfile,其实以前也经常看到sendfile,只是我平时选择性的忽视而已... 先说下sendfile,明天在好好聊下nginx 线 ...
- 未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。
64位系统 IIS7.0配置.net网站时报错:未能加载文件或程序集"XXX"或它的某一个依赖项.试图加载格式不正确的程序. 背景: 在64位的操作系统中, IIS7.0配置.ne ...
- 002. 在HTML页面嵌入循环代码
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs ...
- USACO/friday
Friday the Thirteenth 黑色星期五 描述 13号又是一个星期五.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数.给出N年的 ...
- linux 下查看机器是cpu是几核的
几个cpu more /proc/cpuinfo |grep "physical id"|uniq|wc -l 每个cpu是几核(假设cpu配置相同) more /proc/cpu ...
- memcache 启动参数
启动方式: 参数 说明 -d 以守护程序(daemon)方式运行 -u root 指定用户,如果当前为 root ,需要使用此参数指定用户 -P /tmp/a.pid 保存PID到指定文件 内存设置: ...
- python3_RoboBrowser_test
python3_RoboBrowser_test selenium库作为交互是非常方便的,但是却大大加长了加载的时间,例如需要渲染网址,加载js,造成在爬虫过程中时间变长. 因此找到一个虚拟的浏览器, ...