【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
    };

});

  

时间: 2024-10-29 10:46:26

【JavaScript】创建命名空间,Class,LOG的相关文章

JavaScript中创建命名空间

引用:http://ourjs.com/detail/538d8d024929582e6200000c 在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子: var sayHello = function() { return 'Hello var'; }; function sayHello(name) { return 'Hello function'; }; sayHello(); 最终的输出为 > "Hello v

在JavaScript中创建命名空间的几种写法

在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子: var sayHello = function() { return 'Hello var'; }; function sayHello(name) { return 'Hello function'; }; sayHello(); 最终的输出为 > "Hello var" 为什么会这样,根据 StackOverFlow 的解释,实际上JavaScript的是

JavaScript创建类的方式

一些写类工具函数或框架的写类方式本质上都是 构造函数+原型.只有理解这一点才能真正明白如何用JavaScript写出面向对象的代码,或者说组织代码的方式使用面向对象方式.当然用JS也可写出函数式的代码,它是多泛型的. 为了讨论的单一性,暂不考虑类的继承,(私有,受保护)属性或方法.EMCAScript中实际没有类(class)的概念,但可以把它理解为更广义的概念. 1.构造函数方式 /** * Person类:定义一个人,有个属性name,和一个getName方法 * @param {Strin

javascript创建css、js,onload触发callback兼容主流浏览器的实现

http://www.fantxi.com/blog/archives/load-css-js-callback/ 由于需要写个函数,既可以加载css,又可以加载js,所以对各主流浏览器对加载js.css后是否触发onload事件做了个测试.当然,为了兼容,首先要考虑的是会用到onload和onreadystatechange,但他们并不是万能的.加载js文件onload触发callback不算大问题.css比较特殊,因为Webkeit/FF下加载css不会触发onload事件.所以研究了一晚上

JavaScript创建Image并实现预加载

读取图像属性: <img src="/"image1.jpg"" name="myImage" /><a href="#" onclick="window.alert(document.myImage.width)">Width</a> 动态加载图像: <script language="JavaScript">   var myImage

javascript 创建ajax函数 &quot;四部曲&quot;

开门见山简要的来写一个ajax函数,方便要用到ajax的时候来调用,下面附:获取 json 数据一个小实例,请在服务器下执行...   创建一个 ajax.js 文件把ajax函数代码放进去 //创建ajax函数四部曲  1.创建创建XMLHttpRequest对象   2.连接服务器   3.发送请求   4.接收数据 function ajax(url,sueeccd,lose){ // 1.创建XMLHttpRequest对象 //定义一个全局变量 var xhr = null; //判断

JavaScript创建Map对象(转)

JavaScript 里面本身没有map对象,用JavaScript的Array来实现Map的数据结构. Js代码   /* * MAP对象,实现MAP功能 * * 接口: * size()     获取MAP元素个数 * isEmpty()    判断MAP是否为空 * clear()     删除MAP所有元素 * put(key, value)   向MAP中增加元素(key, value) * remove(key)    删除指定KEY的元素,成功返回True,失败返回False * 

JavaScript 创建一个 form 表单并提交

<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input onclick="MakeForm()" type="button" class="btn grey"

javascript 中的console.log和弹出窗口alert

主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是: 他能看到结构话的东西,如果是alert,淡出一个对象就是[object object],但是console能看到对象的内容. console不会打断你页面的操作,如果用alert弹出来内容,那么页面就死了,但是console输出内容后你页面还可以正常操作. console里面的内容非常丰富,你可以在控制台输入:console,然后就可看到:Console {memory: MemoryInfo

【Java】向一个页面发送post请求并获取其处理之后的结果与用javascript创建一个表单后提交的安全性

本文对比与<[Java]读取网页中的内容>(点击打开链接)一文,向一个页面发送get请求,并获取其处理之后的结果,这里是向一个页面发送post请求,并获取其处理之后的结果.如果向一个页面发送get请求,并获取其处理之后的结果,只需要直接读取一个网页用?后接各种用&参数连接的参数即可,而向一个页面发送post请求,并获取其处理之后的结果,就不是这么简单了. 这里方法可能在普通的Java文件中不会太常见,但在jsp.安卓等javaweb的网页编程中却十分常用 import java.io.