JavaScript的Class模块,纯天然无依赖,只有2k大小,快速高效,让我们优雅的面向对象...

JavaScript的Class模块,让我们优雅的面向对象...

纯天然无依赖,只有2k大小,快速高效。

这是夏老师编写的一个JS模块,用来快速开发面向对象的JS程序,

模块中实现了对Browser,AMD,CMD,node等多种环境的支持。

1源码:jClass.js

jClass.js 文件源码

JavaScript | 复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/**
  快速高效的Class模块,提供了优雅的API
  @ Author : 夏增明老师
  @ Date   :2016年7月29日
  @ QQ     :1500506007
  @ URL    :http://baike.xsoftlab.net
  @ Version:1.0
*/
(function(global){
     
    global = global||{};
    var ClassCache = {};
    /* 类加载器 */
    var Class = function(className,opts){
        /* 如果没有初始化参数,则是查找类对象 */
        if(!opts){
            return ClassCache[className];
        }
         
        var static = {};
        var temp = opts.ctor || function(){};
         
        ClassCache[className] = temp;
 
        /* 处理继承关系 */
        if(typeof opts.extends === 'function' ){
            var obj = new opts.extends;
            console.log(obj);
            temp.prototype = obj;
        }
 
        /* 设置类名 */
        temp.className = className;
        temp.simpleName = className.substring(className.lastIndexOf('.') + 1);
        temp.prototype.class = temp;
         
        /* 把类注册到全局命名空间中 */
        var arr = className.split(".");
        var obj = global;
        for(var in arr){
            if(n==arr.length-1){
                obj[arr[n]] = temp;
            }else{
                obj[arr[n]] = obj[arr[n]]||{};
                obj = obj[arr[n]];
            }
        }
 
        /* 为属性生成GetSet方法 */
        var GettersAndSetters = function(field){
            var format = field.substr(0,1).toUpperCase()+field.substr(1,field.length-1);
            temp.prototype["get"+format] = function(){
                return this[field];
            }
            temp.prototype["set"+format] = function(value){
                this[field] = value;
            }
        }
 
        /* 注册静态变量与静态方法 */
        temp.prototype.static = static;
        temp.static = static;
        for(var f2 in opts.static){
            static[f2] = opts.static[f2];
        }
 
        /* 注册实例变量与实例方法 */
        for(var in opts){
            var exclude = ['static','ctor','extends','final'];
            if( exclude.indexOf(f)!=-1 )continue;
            temp.prototype[f] = opts[f];
            GettersAndSetters(f);
        }
 
        /* 注册常量,使用getFinal(name)获取 */
        var FinalData = {};
        for(var in opts.final){
            FinalData[f] = opts.final[f];
        }
        temp.prototype.getFinal=function(name){
            return FinalData[name];
        }
 
        return temp;
    }
 
    // 注册为CMD模块化对象
    if (typeof define === "function" && define.cmd) {
        define(function(require, exports, module){
            module.exports = Class;
        });
    }
    // 注册为AMD模块化对象
    else if (typeof define !== "undefined") {
        define('Class', [], function () { return Class; });
    }
    // 注册到全局命名空间,例如(浏览器中的window)或者(node中的exports)
    else if (global) {
        global['Class'] = Class;
    }
}(typeof define !== "undefined" || typeof window === "undefined" ? exports : window));

2源码:jClass.min.js

jClass.min.js 文件源码

JavaScript | 复制
1
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('(4(c){c=c||{};3 o={};3 e=4(8,5){9(!5){i o[8]}3 6={};3 2=5.z||4(){};o[8]=2;9(h 5.u===\'4\'){3 7=K 5.u;J.L(7);2.a=7}2.8=8;2.N=8.M(8.I(\'.\')+1);2.a.G=2;3 b=8.F(".");3 7=c;k(3 n j b){9(n==b.w-1){7[b[n]]=2}p{7[b[n]]=7[b[n]]||{};7=7[b[n]]}}3 B=4(d){3 s=d.v(0,1).U()+d.v(1,d.w-1);2.a["O"+s]=4(){i x[d]}2.a["R"+s]=4(y){x[d]=y}}2.a.6=6;2.6=6;k(3 m j 5.6){6[m]=5.6[m]}k(3 f j 5){3 E=[\'6\',\'z\',\'u\',\'l\'];9(E.S(f)!=-1)Q;2.a[f]=5[f];B(f)}3 t={};k(3 f j 5.l){t[f]=5.l[f]}2.a.P=4(A){i t[A]}i 2}9(h g==="4"&&g.T){g(4(H,q,C){C.q=e})}p 9(h g!=="r"){g(\'e\',[],4(){i e})}p 9(c){c[\'e\']=e}}(h g!=="r"||h D==="r"?q:D));',57,57,'||temp|var|function|opts|static|obj|className|if|prototype|arr|global|field|Class||define|typeof|return|in|for|final|f2||ClassCache|else|exports|undefined|format|FinalData|extends|substr|length|this|value|ctor|name|GettersAndSetters|module|window|exclude|split|class|require|lastIndexOf|console|new|log|substring|simpleName|get|getFinal|continue|set|indexOf|cmd|toUpperCase'.split('|'),0,{}))

3构建一个类

JavaScript | 复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
构建一个类,全名为:com.zhenzhigu.Person
定义一个Person变量用来接收类对象
*/
var Person = Class("com.zhenzhigu.Person",{
    /* 静态属性与静态方法 */
    static:{
        a:10,
        b:20,
        hello:function(){
            alert("HelloWorld");
        }
    },
    /* 构造方法,用变元模拟重载 */
    ctor:function(){
        //Person(name,age)
        if(arguments.length==2){
            this.name = arguments[0];
            this.age = arguments[1];
        }
        //Person(name)
        if(arguments.length==1){
            this.name = arguments[0];
        }
        //Person()
        if(arguments.length==0){}
    },
    /* 定义常量 */
    final:{
        PI : 3.14
    },
    /* 实例属性与实例方法 */
    name:'无',
    age:'-1',
    say:function(){
        alert("中华人民共和国万岁");
    }
});

4访问类

JavaScript | 复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* 
类在创建的时候会被注册到全局空间(window),
以类名中的'.'作为层级分隔,可以这样访问它们
*/
console.log( com );
console.log( window.com );
console.log( com.zhenzhigu );
console.log( com.zhenzhigu.Person );
 
/* 两种获取类对象的方式 */
var classA = com.zhenzhigu.Person;
var classB = Class("com.zhenzhigu.Person");
 
/* 获取类的全名 */
console.log( classA.className );
 
/* 获取类的简名 */
console.log( classA.simpleName );

5实例化对象

JavaScript | 复制
1
2
3
4
5
6
7
8
/* 创建对象 */
var p1 = new com.zhenzhigu.Person("八戒",22);
var p2 = new classA("悟净");
var p3 = new classB("红孩儿",18);
/* 输出到控制台 */
console.log( p1 );
console.log( p2 );
console.log( p3 );

6Get/Set方法

所有的实例属性都会自动添加Getters And Setters !

格式:get或set加上属性,首字母大写

JavaScript | 复制
1
2
3
4
5
6
7
8
/* 设置属性 */
p1.setName("悟空");
p1.setAge(19);
/* 输出信息 */
console.log( p1 );
/* 获取属性 */
console.log( p1.getName() );
console.log( p1.getAge() );

7静态属性

类和实例都可以对静态属性进行直接的访问和修改。

JavaScript | 复制
1
2
3
4
5
6
7
8
9
//使用p2对象访问静态属性a
console.log( p2.static.a );
console.log( classA.static.a );
//使用p2对象修改静态属性a
p2.static.a = 66;
//测试是否发生变化
console.log( com.zhenzhigu.Person.static.a );
console.log( p1.static.a );
console.log( classB.static.a );

8静态方法

类和实例都可以对静态方法进行直接的访问和修改。

JavaScript | 复制
1
2
3
4
5
6
7
8
9
10
//p1对象调用静态方法
p1.static.hello();
//p2对象重写静态方法
p2.static.hello = function(city){
    alert(city+"欢迎您!");
}
//直接用类调用静态方法
com.zhenzhigu.Person.static.hello("北京");
//p1对象再次调用静态方法
p1.static.hello("上海");

9读取常量

JavaScript | 复制
1
2
//使用obj.getFinal(name)读取常量
console.log( p1.getFinal('PI') );

10类的继承

JavaScript | 复制
1
2
3
4
5
6
7
/* 创建一个类,继承Person */
var Coder = Class("com.zhenzhigu.Coder",{
    extends:com.zhenzhigu.Person,
    speed : 12
});
var obj = new Coder();
console.log( obj );

JavaScript面向对象OOP思想Class系统的更多相关文章

  1. 拖拽系列二、利用JS面向对象OOP思想实现拖拽封装

    接着上一篇拖拽系列一.JavaScript实现简单的拖拽效果这一篇博客将接着对上一节实现代码利用JS面向对象(OOP)思维对上一节代码进行封装; 使其模块化.避免全局函数污染.方便后期维护和调用:写到 ...

  2. 聚焦JavaScript面向对象的思想

    面向对象是一种软件开发方法,是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物.随着时代的发展,计算机被用于解决越来越复杂的问题.一切事物皆对象,通过面向对象的方式,将现实世界的 ...

  3. Java面向对象OOP思想概述

    目录 OOP思想(Object Oriented Programming) 类和对象 接口 抽象类 OOP三大特性 封装 继承 多态 OOP复用的形式 OOP思想(Object Oriented Pr ...

  4. JavaScript面向对象(OOP)

      前  言 JRedu 面向对象程序设计(简称OOP)是现在最流行的程序设计方法,这种方法有别于基于过程的程序设计方法.在写面向对象的WEB应用程序方面JavaScript是一种很好的选择.它能支持 ...

  5. 面向对象oop思想

    OOP核心思想:封装,继承,多态. 理解: 对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象.而每继承性是对具有层次关系的类的属性和操作进行共享的 ...

  6. [Javascript] 面向对象编程思想

    1.创建对象 1.1 new 用new进行创建对象: var user = new Object(); user.age = 12;//同时为对象添加属性 user.name = 'ajun'; 1. ...

  7. javascript面向对象系列第四篇——OOP中的常见概念

    前面的话 面向对象描述了一种代码的组织结构形式——一种在软件中对真实世界中问题领域的建模方法.本文将从理论层面,介绍javascript面向对象程序程序(OOP)中一些常见的概念 对象 所谓对象,本质 ...

  8. javascript大神修炼记(5)——OOP思想(封装)

    读者朋友们好,前面我们已经讲解了有关javascript的基础,从今天的内容开始,我们就要开始讲有关封装的内容了,这里,我们就一点一点地接触到OOP(面向对象编程)了,如果作为一门语言使用的程序员连O ...

  9. javascript大神修炼记(7)——OOP思想(多态)

    读者朋友们大家好,今天我们就接着前面的内容讲,前面我们已经讲到了继承,今天我们就来讲OOP目前最后一个体现,那就是多态,因为javascript语言的灵活性,所以我们是没有办法使用接口的,所以这也给j ...

随机推荐

  1. Jquery easyUI datagrid载入复杂JSON数据方法

    1.JSON数据为: {     "total":28, "rows": [     {       "itemNo": "1&q ...

  2. 架构设计--用户端全http参数接口详细说明v1

    1. 用户端全http参数接口详细说明v1.doc 1 2. change histor 1 3. 接口通用参数说明 1 4. 函数注册接口(规划中) 3 5. 用户权限模块 3 5.1. 用户注册接 ...

  3. atitit.词法分析的实现token attilax总结

    atitit.词法分析的实现token attilax总结 1. 词法分析(英语:lexical analysis)跟token 1 1.1. 扫描器 2 2. 单词流必须识别为保留字,标识符(变量) ...

  4. cpython和lua源码阅读

    cpython代码很多,不太容易看出来. lua代码真的短小精悍,不得不佩服.

  5. (C#)程序员必读的一些书籍

    前言 ·貌似公司里很著名的一句话,在这里套用过来了,WP研发工程师,首先是WPF/SL研发工程师,WPF/SL研发工程师首先是是个C#研发工程师,C#研发工程师首先Windows研发工程师.Windo ...

  6. oozie4.3.0的安装与配置 + hadoop2.7.3

    安装步骤 mysql的配置 oozie的安装 oozie的配置 oozie的启动与登录 常用oozie的命令 1. mysql的配置 mysql的安装自行解决,然后在mysql上 创建oozie数据库 ...

  7. codeforces 429 On the Bench dp+排列组合 限制相邻元素,求合法序列数。

    限制相邻元素,求合法序列数. /** 题目:On the Bench 链接:http://codeforces.com/problemset/problem/840/C 题意:求相邻的元素相乘不为平方 ...

  8. Thinkphp3.2 PHPMailer 发送 QQ邮箱 163邮箱

    在进入正题这前先看下网易(163)邮箱的服务器地址和端口号 类型 服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号 收件服务器 POP pop.163.com 995 110 收件服务器 ...

  9. Css三栏布局自适应实现几种方法

    Css三栏布局自适应实现几种方法 自适应实现方法我们可以从三个方法来做,一个是绝对定位 ,自身浮动法 和margin负值法了,下面我们一起来看看这三个例子吧,希望例子能帮助到各位同学. 绝对定位法三栏 ...

  10. 当心文件 I/O 有错误

    当心文件 I/O 有错误. #include <iostream> #include <iostream> #include <numeric> #include ...