当前位置: 首页 > news >正文

我的第一篇博客 Javascript继承

前几天搜索JS继承的时候无意中搜到了..司徒正美的博客..里面的文章太有用了.. 我也是第一次使用博客园

地址 http://www.cnblogs.com/rubylouvre/ 然后看了她的继承一些文章.

现在公司要弄一个社区...我觉得可以使用一个继承框架来管理类.当然也要实现继承.于是乎就开始动工了...

 

框架简称 Ljs 是学习Js的意思  Learning Javascript google翻译的

继承的主要思路是参考 正美的 还有一些命名是摘用ExtJs的, 刚完成没多久..肯定很多Bug..还没调试

主要功能有:

 classname 是类名.包括命名空间 config是类的配置函数
 Ljs.define(classname,config) 
init是构造函数 , inherit是要继承的类,可以是字符串,也可以是类. $static是静态属性和方法(不会被继承),其余的都会被当作对象的属性或方
 实现了 $super语法 实列  $super必须放在第一个参数s
extends:function($super,params1...paramsN){
  框架会自动判断子类是否有$super参数
 $super() //即父类的方法
 do something
}

 Ljs.using(classname[,alias]) 主要是引入类到全局中,alias讲类更换的别名 示列

Ljs.define("n.myTestClass",{...}); //创建了一个类 默认是创建到 Ljs.classes空间下..所以要使用类的时候需

var m = new Ljs.classes.n.myTestClass()

但是使用 Ljs.using("n.myTestClass") 后即可 var m = new myTestClass()

使用 alias 参数 Ljs.using("n.myTestClass","cls"); 后 var m = new cls();s

继承部分大致就这些

 

/*
Learning Javascript
Ljs by 黑子
*/



(function () {
    //#region 常用方法
    if (typeof Ljs === "undefined") {
        window.Ljs = {};
    } else { return; }
    Ljs.copy = function (obj, config, deft, hasOwn) {
        if (deft) { Ljs.copy(obj, deft, hasOwn) }
        if (obj && config) {
            for (var k in config) {
                if (!hasOwn || config.hasOwnProperty(k)) {
                    obj[k] = config[k];
                }
            }
        }
    };
    Ljs.copy(Ljs, {
        copyIf: function (obj, config) {
            for (var k in config) {
                if (obj[k] === undefined) {
                    obj[k] == config[k];
                }
            }
        },
        classes: {},
        $: function (s) {
            return document.getElementById(s);
        }
    });
    Ljs.Function = {
        alias: function (Met, Obj) {
            return function () {
                Met.apply(Obj, arguments);
            }
        }
    }
    Ljs.alias = Ljs.Function.alias;
    Ljs.Array = function (arg) {
        return Array.prototype.slice.call(arg);
    }
    Ljs.copy(Ljs.Array, {});

    Ljs.namespaces = {
        ns: function (name, obj) {
            name = name.split(".");
            var cDom = Ljs.classes;
            for (var i = 0; i < name.length; i++) {
                var cName = name[i];
                if (obj && i == name.length - 1) {
                    if (cDom[cName]) {
                        Ljs.copy(obj, cDom[cName], true)
                    }
                    cDom[cName] = obj;
                } else if (!cDom[cName]) {
                    cDom[cName] = {};
                }
                cDom = cDom[cName];
            }
            return cDom;
        },
        using: function (name, al) {
            name = name.split(".");
            var cDom = Ljs.classes;
            for (var i = 0; i < name.length; i++) {
                var cName = name[i];
                if (!cDom[cName]) { alert("引入的类不存在"); return; }
                cDom = cDom[cName];
            }
            cName = al || cName;
            if (window[cName] === cDom) return;
            if (window[cName]) {
                alert("当前已被引用,请换别名");
                return;
            }
            window[cName] = cDom;

        },
        getClass: function (name) {
            name = name.split(".");
            var cDom = Ljs.classes;
            for (var i = 0; i < name.length; i++) {
                var cName = name[i];
                if (!cDom[cName]) { alert("继承的类不存在"); return; }
                cDom = cDom[cName];
            }
            return cDom;

        }
    }
    Ljs.using = Ljs.namespaces.using;
    Ljs.ns = Ljs.namespaces.ns;
    Ljs.browser = function () {
        var ua = navigator.userAgent.toLowerCase();
        var check = function (regex) {
            return regex.test(ua);
        },
        docMode = document.documentMode,
        isOpera = check(/opera/),
        isOpera10_5 = isOpera && check(/version\/10\.5/),
        isChrome = check(/\bchrome\b/),
        isWebKit = check(/webkit/),
        isSafari = !isChrome && check(/safari/),
        isSafari2 = isSafari && check(/applewebkit\/4/),
        isSafari3 = isSafari && check(/version\/3/),
        isSafari4 = isSafari && check(/version\/4/),
        isIE = !isOpera && check(/msie/),
        isIE7 = isIE && (check(/msie 7/) || docMode == 7),
        isIE8 = isIE && (check(/msie 8/) && docMode != 7 && docMode != 9 || docMode == 8),
        isIE9 = isIE && (check(/msie 9/) && docMode != 7 && docMode != 8 || docMode == 9),
        isIE6 = isIE && check(/msie 6/),
        isGecko = !isWebKit && check(/gecko/),
        isGecko3 = isGecko && check(/rv:1\.9/),
        isGecko4 = isGecko && check(/rv:2\.0/),
        isFF3_0 = isGecko3 && check(/rv:1\.9\.0/),
        isFF3_5 = isGecko3 && check(/rv:1\.9\.1/),
        isFF3_6 = isGecko3 && check(/rv:1\.9\.2/),
        isWindows = check(/windows|win32/),
        isMac = check(/macintosh|mac os x/),
        isLinux = check(/linux/),
        scrollWidth = null;
        return {
            docMode: docMode,
            isOpera: isOpera,
            isOpera10_5: isOpera10_5,
            isWebKit: isWebKit,
            isChrome: isChrome,
            isSafari: isSafari,
            isSafari3: isSafari3,
            isSafari4: isSafari4,
            isSafari2: isSafari2,
            isIE: isIE,
            isIE6: isIE6,
            isIE7: isIE7,
            isIE8: isIE8,
            isIE9: isIE9,
            isGecko: isGecko,
            isGecko3: isGecko3,
            isGecko4: isGecko4,
            isFF3_0: isFF3_0,
            isFF3_5: isFF3_5,
            isFF3_6: isFF3_6,
            isLinux: isLinux,
            isWindows: isWindows,
            isMac: isMac
        }
    } ();
    //#endregion

    //#region 继承机制 
    var Class = Ljs.Class = function (config) {
        config = config || {};
        var init = config.init || function () { };
        var superclass = config.inherit || Object;
        var $static = config.$static || {};
        delete config.init;
        delete config.inherit;
        delete config.$static;
        var $class = Class.bridge(superclass, init); //封装原始构造函数
        Class.superSyntax($class.prototype, config); //添加方法|属性并实现$super语法
        Ljs.copy($class, $static); //给类添加静态方法 || 属性
        return $class;
    }
    Ljs.copy(Ljs.Class, {
        reSuper: /function(?:\s+)?\(.*(\$super)+.*?\)/g,
        bridge: function (superclass, initialize) {
            var cls = function () {
                superclass.apply(this, arguments);
                initialize.apply(this, arguments);
            }
            var f = function () { }
            f.prototype = superclass.prototype;
            cls.prototype = new f();
            cls.prototype.superclass = superclass;
            cls.prototype.constructor = cls;
            cls.superclass = superclass;
            cls.constructor = initialize;
            return cls;
        },
        superSyntax: function (obj, options) {
            for (var k in options) {
                if (options.hasOwnProperty(k)) {
                    if ((obj[k] != undefined) && (typeof (options[k]) === "function") && (Class.reSuper.test(options[k].toString()))) {
                        var kk = k;
                        obj[kk] = function () {
                             var $super = Ljs.alias(this.superclass.prototype[kk], this);
                            return options[kk].apply(this, Array($super).concat(Ljs.Array(arguments)));
                        }
                    } else {
                        obj[k] = options[k];
                    }
                }
            }
        }
    });

    var Manager = Ljs.ClassManager = {
        define: function (classname, config) {
            ///	<summary>
            ///		Ljs.define(classname,config) 创建自定义类并放入Ljs命名空间下 
            ///	</summary>
            ///	<param name="classname" type="String">
            ///	     classname 类名 包括命名空间 namespace.youclass
            ///	</param>
            ///	<param name="config" type="Object">
            ///	     config 配置文件 init 类的构造函数 , inherit 继承的父类 $static 类的静态方法和属性 其余都为类的方法
            ///	</param>
            if (classname == undefined) throw ("缺少类名");
            config.classname = classname;
            if (typeof config.inherit === "string") {
                config.inherit = Manager.getClass(config.inherit)
            }
            var newClass = Ljs.Class(config);
            Ljs.namespaces.ns(classname, newClass);
            return newClass;
        },
        getClass: Ljs.namespaces.getClass
    }
    Ljs.define = Ljs.ClassManager.define;
    //#endregion

})();

转载于:https://www.cnblogs.com/WingsBlack/archive/2011/10/27/2226567.html

相关文章:

  • manila nfs 删除 share 分析
  • atl中控件头文件所在位置
  • input标签的type为select、radio、checkbox的使用
  • matlab练习程序(makelut/applylut)
  • “图片”--预览
  • Linux整数比较
  • ios设置textField只能输入数字用于电话号码
  • 安装Mariadb常见的问题(五)
  • 入门,创建uni-app项目
  • Java中避免表单重复提交
  • uni-app中理解,区分,使用rpx单位和px单位及样式字体的导入
  • Selenium2+python自动化27-查看selenium API
  • 了解uni-app的生命周期(应用,页面生命周期)执行顺序
  • linux之程序包安装
  • Java开发程序,使用编辑器编写创建Java项目、类
  • 《剑指offer》分解让复杂问题更简单
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • git 常用命令
  • Github访问慢解决办法
  • iOS | NSProxy
  • iOS 颜色设置看我就够了
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 前端存储 - localStorage
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 试着探索高并发下的系统架构面貌
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • mysql面试题分组并合并列
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (Java数据结构)ArrayList
  • (pojstep1.1.2)2654(直叙式模拟)
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (一)Java算法:二分查找
  • (正则)提取页面里的img标签
  • (转)创业的注意事项
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET 设计模式初探
  • .net和jar包windows服务部署
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • /var/log/cvslog 太大
  • [100天算法】-不同路径 III(day 73)
  • [20140403]查询是否产生日志
  • [Android]使用Retrofit进行网络请求
  • [BJDCTF 2020]easy_md5
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [C/C++] -- 二叉树
  • [Contiki系列论文之2]WSN的自适应通信架构
  • [DM复习]关联规则挖掘(下)
  • [GN] Vue3快速上手1
  • [hdu4622 Reincarnation]后缀数组