诚邀java+javascript爱好者共同打造javascript类库
一個程序員 2011-09-04 01:34:24 自从事web开发以来
一直想打造咱国人开放式的javascript类库。
愿意奉献自己的精华,乃是咱们开发者志同道合之处。
有道是:纳众家之所长,汇天下之精髓。
任何一个框架,起初是由一些心得、解决问题的代码片段,等等。
聚合在一起,逐渐强化与扩展,久而久之,形成一个强大的辅助性工具库。
直到使用工具库的人注意到了这点,并着手修订工具库,精减代码,
再加上更和合理的设计工具库,使得它上升为框架的级别,以供大家使用。
因此咱们致力于开发工作的同时,汇聚自己的心得、idea。
共同打造一个诸如jquery一样的框架。
当然不是真的要跟jquery一样,因为已经有了jquery。
但是,并不表示有了现成的jquery、ext...就能得到满足。
至少它们都不是咱国人的,而我的爱国之心对此很不满。
我想把方向定在javascript编写语法上。用java语法编写javascript。再在这个基础上做其他应用性开发。
更好的解释应该叫java in javascript。这有很好的一点,能让熟悉java但对javascript不擅长的人使用起来更为方便,处处尽显熟悉的身影,
这就必须要让javascript具备OOP概念,而不仅仅是基于OO的事件驱动,因此注重的是编码规则(非字符编码,是编写代码)。
至于javascript的弱类型,这是个硬伤,目前觉得除了用编码风格来约束它,没有更好的法子。
总之尽可能的要实现OOP的所有思想,因为这仅仅是个开始,只有先妥协了语言规则,方可基于该规则做其他的事情。
目前要实现的OOP语言规则:
1、要在javascript引入包的概念(package)
2、要在1的基础上导入包(improt)
3、要在2中引入类的概念
4、要在3的基础上引入继承的概念
5、要在4的基础上引入多态的概念
6.1、在5的基础上引入抽象类的概念(个人觉得可不实现,)
6.2、在5的基础上引入接口的概念
7、要在6的基础上实现接口间的继承
.
.
.
n、在以上全实现后,需要完成java.util包中的最常用接口和类,如Map、HashMap。
n+1、对Object原始类型的扩展
n+2、线程概念(又是个硬伤...)
n++...
但因为量的问题,java语言中在java语言结构的设计上基本全是接口+抽象类,因此不要一一实现。
目前已经完成了接口实现,6.1的抽象类暂时停工
直接来几个实例吧。
犹如在java中创建一个类:
package com.xxx.xxx; // 创建命名空间包结构
improt com.zzz.zzz.Z; // 导入所需的其他引用(包+类名)
Class Test{
private String j;
public int i;
Test(){}
Test(arg1, arg2){
super(arg1, arg2);
this.i = arg1 + arg2
}
public int getI(){
return this.i;
}
public String getJ(){
return this.j;
}
}
映射成javascript:
// 创建命名空间包结构
Fan.package('com.xxx.xxx');
// 导入所需引用,由于js位于客户端执行的特殊性,当从未加载过Z文件时,该操作会同步发出http请求js文件
Fan.improt('com.zzz.zzz.Z');
// 创建一个类,可变长度参数列表:
// 参数1:类名(完整类名),最后一个参数:类的实现。
// 当存在显示继承时(缺省继承Object),继承类只占参数2的位置;
// 从参数2 - 最后一个参数之间,全部属于实现接口的位置。
Fan.clazz('com.xxx.xxx.Test', function(arg1, arg2){
this.$super(arg1, arg2);
var j;
this.i = arg1 + arg2;
this.getI = function (){
return this.i;
}
this.getJ = function {
return j;
}
});
java中创建一个接口:
Interface ICreate {
public static final Stirng ABC_DEF = "abcdef";
public void doCreate();
public void doRemove();
}
javascript创建接口:
Fan.interface('ICreate', function(){
this.ABC_DEF = 'abcdef';
this.doCreate = Function;
this.doRemove = Function;
});
java中实现一个接口:
Class Test implemens ICreate {
Test(){
super();
}
public void doCreate(){
// 非抽象类,一定要实现接口中的方法
}
public void doRemove(){
}
}
javascript实现一个接口:
Fan.clazz('Test', 'ICreate', function(){
this.$super();
this.doCreate = function(){
// 一定要实现接口中的方法,否则在创建类时给出警告
}
this.doRemove = function(){
}
});
java中的继承:
Class Test extends SuperClass implemens ICreate {
Test(){
super();
}
public void doCreate(){
// 非抽象类,一定要实现接口中的方法
}
public void doRemove(){
}
}
javascript继承,依旧是单线继承:
Fan.clazz('Test', SuperClass, ICreate, function(){
this.$super(); // 永远加上这行,主动去调用父类构造器,目前没实现缺省自动调用super
this.doCreate = function(){
// 一定要实现接口中的方法,否则在创建类时给出警告
}
this.doRemove = function(){
// this.$super 父类对象句柄,父父类:this.$super.$super, 深层次继承时取得各层父类句柄用法以此类推
this.$super.doRemove();
}
});
以上部分已经实现,但其中有不尽人意的地方,随后讲。
Fan的命名是暂时,名为扇子的意思。扇子,乃是从古至今给予人极大帮助的工具,既可解暑又可驱蚊。
想起小时候...唰...回到15年前
天气很热,晚上我们都睡在屋子外面(乡下),又能数星星了
奶奶又在用这把大大的蒲扇给我扇风驱蚊(5-10岁都是跟奶奶睡)。
..再刷..回到现在,抱歉带你们穿越了...
天热的时候总是想起那把大蒲扇,故取名为Fan,因为现在很热。
以上Fan中关键字命名也只是暂定,比如调用父类构造器的$super,因为IE中super为关键字,不可用作其他。
为了尽量避免和关键字产生冲突,又要取名更符合java语法需要,很不情愿的加了个前缀$,本想用¥,或者¥,再或者¥...
Fan目前的体系结构(草稿):
Fan v1.3.7
Fan.ui 专门负责处理ui方面,如创建一个面板,new Fan.ui.Panel(cfg)
Fan.util 辅助类库集合,如:Fan.util.Map
Fan.net ajax部分
Fan.error 各种自定义异常
Fan.dom 专门复杂html处理,如查询、遍历...
Fan.event 专门负责ui上的事件处理
Fan.fn 离散函数集合
Fan.keys 存放各种配置,以及特殊性标志
Fan.browser 浏览器个各种操作,如:保存收藏、打印、新建窗口,关闭窗口等等..
...
已实现的:
语言规则已经实现到了接口继承,也就是第7步
Fan.util.Map
Fan.util.Logger
Fan.net.Ajax
Fan.fn
Fan.keys
Fan.browser 需扩展,目前只有浏览器的识别
历时1个月,部分内容早在工作中就已经完成(Ajax,Map,Logger)。
不尽人意的地方:
1、代码潦草,时常兴起敲了一大段无注释代码,很多地方存在关键性注释,日后补足
2、在实现多重接口上面,存在一个类型鉴别问题不得解决;类继承没有这一问题,因为类继承是单线。
问题:我想用obj instanceof Interface 来鉴别对象是否属于某接口的派生;
但是未能实现,唯有用蹩脚的做法:Fan.instance(obj, Interface);
看来还是js功底不行,待高人指教。
更多的扩展应用等着你来参与。
诚请诸位javascript爱好者,工作之余致力打造Fan,咱们都是官方。
Q:87688973