JavaScript面向对象OOP思想Class系统
JavaScript的Class模块,纯天然无依赖,只有2k大小,快速高效,让我们优雅的面向对象...
| |目录
- 1源码:jClass.js
- 2源码:jClass.min.js
- 3构建一个类
- 4访问类
- 5实例化对象
- 6Get/Set方法
- 7静态属性
- 8静态方法
- 9读取常量
- 10类的继承
JavaScript的Class模块,让我们优雅的面向对象...
纯天然无依赖,只有2k大小,快速高效。
这是夏老师编写的一个JS模块,用来快速开发面向对象的JS程序,
模块中实现了对Browser,AMD,CMD,node等多种环境的支持。
1源码:jClass.js
jClass.js 文件源码
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 n 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 f 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 f 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 文件源码
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构建一个类
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访问类
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实例化对象
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加上属性,首字母大写
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静态属性
类和实例都可以对静态属性进行直接的访问和修改。
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静态方法
类和实例都可以对静态方法进行直接的访问和修改。
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读取常量
1
2
|
//使用obj.getFinal(name)读取常量 console.log( p1.getFinal( 'PI' ) ); |
10类的继承
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系统的更多相关文章
- 拖拽系列二、利用JS面向对象OOP思想实现拖拽封装
接着上一篇拖拽系列一.JavaScript实现简单的拖拽效果这一篇博客将接着对上一节实现代码利用JS面向对象(OOP)思维对上一节代码进行封装; 使其模块化.避免全局函数污染.方便后期维护和调用:写到 ...
- 聚焦JavaScript面向对象的思想
面向对象是一种软件开发方法,是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物.随着时代的发展,计算机被用于解决越来越复杂的问题.一切事物皆对象,通过面向对象的方式,将现实世界的 ...
- Java面向对象OOP思想概述
目录 OOP思想(Object Oriented Programming) 类和对象 接口 抽象类 OOP三大特性 封装 继承 多态 OOP复用的形式 OOP思想(Object Oriented Pr ...
- JavaScript面向对象(OOP)
前 言 JRedu 面向对象程序设计(简称OOP)是现在最流行的程序设计方法,这种方法有别于基于过程的程序设计方法.在写面向对象的WEB应用程序方面JavaScript是一种很好的选择.它能支持 ...
- 面向对象oop思想
OOP核心思想:封装,继承,多态. 理解: 对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,一个对象类定义了具有相似性质的一组对象.而每继承性是对具有层次关系的类的属性和操作进行共享的 ...
- [Javascript] 面向对象编程思想
1.创建对象 1.1 new 用new进行创建对象: var user = new Object(); user.age = 12;//同时为对象添加属性 user.name = 'ajun'; 1. ...
- javascript面向对象系列第四篇——OOP中的常见概念
前面的话 面向对象描述了一种代码的组织结构形式——一种在软件中对真实世界中问题领域的建模方法.本文将从理论层面,介绍javascript面向对象程序程序(OOP)中一些常见的概念 对象 所谓对象,本质 ...
- javascript大神修炼记(5)——OOP思想(封装)
读者朋友们好,前面我们已经讲解了有关javascript的基础,从今天的内容开始,我们就要开始讲有关封装的内容了,这里,我们就一点一点地接触到OOP(面向对象编程)了,如果作为一门语言使用的程序员连O ...
- javascript大神修炼记(7)——OOP思想(多态)
读者朋友们大家好,今天我们就接着前面的内容讲,前面我们已经讲到了继承,今天我们就来讲OOP目前最后一个体现,那就是多态,因为javascript语言的灵活性,所以我们是没有办法使用接口的,所以这也给j ...
随机推荐
- 安装配置PhoneGap开发环境(二)——使用Cordova取代PhoneGap创建项目
1 Cordova是谁 PhoneGap的官方文档说的非常清楚.Cordova是PhoneGap的引擎,这两者的关系类似于WebKit与Chrome浏览器的关系.所以一些核心的基础操作对于Cordov ...
- Linux下使用DD命令测试磁盘读写速度
dd是Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换,所以可以用来测试硬盘的读写能力~ 几种常见的DD命令,先看一下区别~ dd bs=6 ...
- PCI-Express协议传输层读书笔记
http://www.doczj.com/doc/35cb19633169a4517723a3d9-9.html
- CXF学习笔记 之 “注解”
@WebService 1.serviceName: 对外发布的服务名,指定 Web Service 的服务名称:wsdl:service.缺省值为 Java 类的简单名称 + Service.(字符 ...
- Unix系统编程()执行非局部跳转:setjmp和longjmp
使用库函数setjmp和longjmp可执行非局部跳转(local goto). 术语"非局部(nonlocal)"是指跳转目标为当前执行函数之外的某个位置. C语言里面有个&qu ...
- Linux kernel 之 uart 驱动解析
uart 是一种非常之常见的总线,比如DEBUG信息输出,小数据量数据传输,485,以及蓝牙的控制,GPS,很多都是通过uart 进行数据传输并进行控制. 在Linux kernel 内部,uart ...
- golang 环境bash 以及shell
standard_init_linux.go:178: exec user process caused "no such file or directory" 2018年04月2 ...
- Java中float/double取值范围与精度
Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个 ...
- C51寄存器详解(Reg51.h)
Reg51.h 这个头文件将C程序中能用到的寄存器名或寄存器中某位的名称与硬件地址值做了对应,在程序中直接写出这些名称,集成开发环境就能识别,并最终转换成机器代码,实现对单片机各硬件资源的准确操控. ...
- python的zipfile实现文件目录解压缩
主要是 解决了压缩目录下 空文件夹 的压缩 和 解压缩问题 压缩文件夹的函数: # coding:utf- import os import zipfile def zipdir(dirToZip,s ...