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的更多相关文章

  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. 使用jquery插件实现图片延迟加载技术(懒加载)

    有时我们看到一些大型网站,页面如果有很多图片的时候,当你滚动到相应的行时,当前行的图片才即时加载的,这样子的话页面在打开只加可视区域的图片,而其它隐藏的图片则不加载,一定程序上加快了页面加载的速度,对 ...

  2. 团队项目开发中,常见的版本控制有svn,git

    团队项目开发中,常见的版本控制有svn,git

  3. GNU C 扩展(转)

    GNU CC 是一个功能非常强大的跨平台 C 编译器,它对 C 语言提供了很多扩展,这些扩展对优化.目标代码布局.更安全的检查等方面提供了很强的支持.这里对支持支持 GNU 扩展的 C 语言成为 GN ...

  4. caffe: compile error : undefined reference to `cv::imread(cv::String const&, int)' et al.

    when I compile caffe file : .build_debug/lib/libcaffe.so: undefined reference to `cv::imread(cv::Str ...

  5. fasterflect-vs-hyperdescriptor-vs-fastmember-vs-reflection/

    http://www.codewrecks.com/blog/index.php/2008/10/04/expression-tree-vs-reflection/ http://www.codepr ...

  6. Windows下IntelliJ IDEA中运行Spark Standalone

    ZHUAN http://www.cnblogs.com/one--way/archive/2016/08/29/5818989.html http://www.cnblogs.com/one--wa ...

  7. [unity3d程序] 颜色渐变效果

    研究了下,颜色变化时遵从RGB圆环(就是说颜色条对接一下成环)路径最小变化原则.举个例子,加入ABCDE四个颜色点,并且A和E在同一点(转了一圈)设定从A变化到C的话,有两种路径,一种ABC,还一种A ...

  8. pyzmq missing when running ipython notebook

    Q: I can run iPython, but when I try to initiate a notebook I get the following error: ~ ipython not ...

  9. Sklearn库例子2:分类——线性回归分类(Line Regression )例子

    线性回归:通过拟合线性模型的回归系数W =(w_1,…,w_p)来减少数据中观察到的结果和实际结果之间的残差平方和,并通过线性逼近进行预测. 从数学上讲,它解决了下面这个形式的问题:      Lin ...

  10. 8000401a 错误 ,检索 COM 类工厂中 CLSID 为 的组件时失败,原因是出现以下错误: 8000401a。

    "/"应用程序中的服务器错误. -------------------------------------------------------------------------- ...