【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 ...
随机推荐
- c笔记
关于数组的操作: 初始化: 完全初始化: Int a[5] = {1,3,4,5,6}; 不完全初始化: 未被初始化的元素自动为零 Int a[5] = {1, 3, 4}; 不初始化, 所有元 ...
- Netty系列之Netty可靠性分析
作者 李林锋 发布于 2014年6月19日 | 29 讨论 分享到:微博微信FacebookTwitter有道云笔记邮件分享 稍后阅读 我的阅读清单 1. 背景 1.1. 宕机的代价 1.1. ...
- Improve Scalability With New Thread Pool APIs
Pooled Threads Improve Scalability With New Thread Pool APIs Robert Saccone Portions of this article ...
- svn tree conflicts 解决方法
svn resolve --accept working -R XXX. 其中XXX为提示冲突的目录.
- Lucene 对文档打分的规则整理记录
摘引自:http://www.cnblogs.com/forfuture1978/archive/2010/02/08/1666137.html Lucene的搜索结果默认按相关度排序,这个相关度排序 ...
- [IoC]6 详解@Autowired、@Qualifier和@Required
A.@Autowired org.springframework.beans.factory.annotation.Autowired public @interface Autowired Mark ...
- 006. C#使用WMI操作远程计算机
1. 使用WMI CIM studio 查看\root\CIMV2 所有可使用的表/字段(类/属性) , 点击下载 WMI CIM studio 2. 安装完成后打开VMI CIM studio
- C数据类型
结构体 因为数组中各元素的类型和长度都必须一致,以便于编译系统处理.为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”.它相当于其它高级语言中的记录.“ ...
- 转载——Python模拟登录代码
''' Created on 2014-2-20 @author: Vincent ''' import urllib.parse import gzip import json import re ...
- nginx http跳转到https
server { listen 80; server_name www.888.com; location / { #index.html放在虚拟主机监听的根目录下 root /usr/local/n ...