诚邀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

...全文
489 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovemquan 2011-09-08
  • 打赏
  • 举报
回复
LZ V5 Do more job with less codes
lovemquan 2011-09-08
  • 打赏
  • 举报
回复
<i>LZ</i><b>V5</b> Do more job with less codes
zhuolei123 2011-09-07
  • 打赏
  • 举报
回复
搞不懂为什么那么多人喜欢用java来写JavaScript,JavaScript有很多优点是java无法比例的,特别是在灵活性上。
json格式的JavaScript对象,比java风格的JavaScript对象用起来要灵活的多,简洁的多,可扩展性也会更好,不管方法还是属性,随时都可以增加、修改、删除,一个replace就有多种用法
var arr = []
str.replace(/\<a[^>]*>[^<]*<\/a>/gi,function(n){
arr.push(n);
});
//匹配出字符串中所有的a标记,并存入到数组当中

上面的这种replace写法,或者说实现同样的功能,我还真不知道在java里面怎么写
firebugdotname 2011-09-06
  • 打赏
  • 举报
回复
引入包的概念,我想代码的物理位置应该会分散在不同的js文件中吧。 那导致的web性能(过多的请求js文件,会导致页面打开速度变慢) 如何解决?
firebugdotname 2011-09-06
  • 打赏
  • 举报
回复
关于包, 我其实想问你的是, 你的代码的物理位置是分散在多个文件里面的吗? 如果不是, 那是否会导致创

建一个宏大的js文件? 如果不是,

分散在多个文件里面的话,main文件如何加载其他的js文件(包), 是直接在html页面添加 <script />标签,

还是用异步(?同步)请求包的代码片断?
一個程序員 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 qin4837463 的回复:]

楼主,能否为小弟解决一个问题,就是用javascript实现telnet 我的代码是这样的:
function exec(command) {
try {
var wsh = new ActiveXObject("WScript.shell");
if(wsh) {
wsh.Run(command);
}
} catch (e) {
alert(e.message);
}

……
[/Quote]

你这代码要是浏览器允许的话那就危险了,你要实现的应该只是做个测试吧?

那我告诉你,js没权限执行浏览器设置,你要调用Active脚本,浏览器出于安全考虑一定要得到用户的确认,或者设置允许未授权的Active执行。

要是哪款浏览器允许用js这么做,那这个浏览器你也不会再用。除非你能够百毒不侵。
qin4837463 2011-09-06
  • 打赏
  • 举报
回复
楼主,能否为小弟解决一个问题,就是用javascript实现telnet 我的代码是这样的:
function exec(command) {
try {
var wsh = new ActiveXObject("WScript.shell");
if(wsh) {
wsh.Run(command);
}
} catch (e) {
alert(e.message);
}

}
现在有一个问题,就是IE浏览器默认是阻止该行为的,想执行这段代码就要把浏览器的安全级别调低,能不能用JS先实现注册表的注册,让侯再执行这段代码,或者是其他的什么解决办法能让客户不用调整浏览器的安全级别,求指教!! 急
z775480954 2011-09-06
  • 打赏
  • 举报
回复
顶楼主
一個程序員 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 firebugdotname 的回复:]

关于包, 我其实想问你的是, 你的代码的物理位置是分散在多个文件里面的吗? 如果不是, 那是否会导致创

建一个宏大的js文件? 如果不是,

分散在多个文件里面的话,main文件如何加载其他的js文件(包), 是直接在html页面添加 <script />标签,

还是用异步(?同步)请求包的代码片断?
[/Quote]

补充:
improt 只在需要时,才去服务器上拉文件下来,已经拉过的文件不会重复拉。发的是同步请求。
异步情况考虑过,所以又加入了一个deferImprot,异步请求去拉js文件。
一個程序員 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 firebugdotname 的回复:]

引入包的概念,我想代码的物理位置应该会分散在不同的js文件中吧。 那导致的web性能(过多的请求js文件,会导致页面打开速度变慢) 如何解决?
[/Quote]

/**
*
* 创建Fan扩展类的模板
*
* 如: 创建:Fan.aaa.bbb.ccc.ClassName
*
* 文件名:ClassName.js (规则:属于与命名空间目录对应的实际目录中,即:Fan_root/aaa/bbb/ccc/ClassName.js)
*
*/

/**
* 声明命名空间
*/
Fan.package('Fan.aaa.bbb.ccc');

/**
* 立即引入包
* 第二参数(默认true):false表示不公开Class1,即:不全局化,使用时仍然需要全路径
* var c = new Fan.aaa.bbb.ccc.Class1();
* 为true时:
* var c = new Class1();
*/
Fan.improt('Fan.aaa.bbb.ccc.Class1', false);
Fan.improt('Fan.aaa.bbb.ccc.Interface1', false);

/**
* 延迟引入包
* 参数解释同上
*/
Fan.deferImprot('Fan.aaa.bbb.ccc.Class2', false);
Fan.deferImprot('Fan.aaa.bbb.ccc.Interface3', false);

/**
* 创建一个类,可变长度参数列表:(类名,[父类,][接口(可多个),] 实现体)
* 参数1:类名(完整类名)。
* 最后一个参数:类的实现,为function构成。
* 当存在显示继承时(缺省继承Object),继承类只占参数2的位置;
* 从参数2 - 最后一个参数之间,全部属于实现接口的位置。
*
*/
Fan.clazz('Fan.aaa.bbb.ccc.ClassName', /* [superClass,][interface,] */ function(config) {
// 必须在类的首行,显示调用父类构造方法,静态类除外,静态类不能构造成对象,无对象则无父级对象
this.$super(arg1, arg2);

this.a = config.a;
this.getA = function(){
return this.a;
}
});
  • 打赏
  • 举报
回复
不是很赞同,原本对jq的庞大与复杂的调用就比较不耐烦,在一些对性能与效率需求比较严格的项目里(例如JS游戏),多半还是直接写些原生的代码更好,虽然会在一些代码上做封装,但绝对不会为了代码观感去绕远路,具体项目具体分析,
KK3K2005 2011-09-06
  • 打赏
  • 举报
回复
不知道怎么说

还是鼓励和支持下lz吧
firebugdotname 2011-09-05
  • 打赏
  • 举报
回复
在此之前,还是想请教一下楼主。关于在js中实现“包”的思路。
狄默默斯基 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 diky87688973 的回复:]
面向对象的三大基本特征继承、封装、多态
js没有包的概念,只有闭包的概念...
[/Quote]

凭着我之前学校学过一点java的只是来看,,所谓的包其实就是个文件夹,没那么玄乎!!!
我看一本书上描述,js中的包类似这种对象嵌套对象的写法。。
<script>
jscript=function(){};
jscript.ui=function(){};
jscript.ui.show=function(){
alert('success');
}
jscript.ui.show();
</script>
再说,我理解的面向对象,只要有“class”的概念,有this指针,有成员属性、函数,我就认为是面向对象,,微软说的几大特征我才不鸟它呢!
一個程序員 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 theforever 的回复:]

可以借鉴JAVA的一些好的地方,但没必要硬去用JS实现一个JAVA,那样就没什么意义了,对于一个JS类库来说,它应该是一个JS类库,而不是一个JS版的JAVA开发环境。何况JAVA整个那一套对于JS类库的功能来说,不可能完全适合。

其实类库这些,早些年国内的大中公司一直都有各自一套(无论是完全自研,还是在PROTYPE等基础类库基础之上扩展的),即使不见得都比JQ强很多,但也不是差太多,只……
[/Quote]

sorry,竟然漏了回复。

非常感谢你的回复!

心还是不能凉啊,凡事还是要抱点希望。万念俱灰的话就只剩下杯具了。

国足其实也在努力,只是不见成效。

parseJava其实是激励自己的一种美好幻想,即使实现也是蹩脚的很。

我的想法是在囊括大家积累的心得,再服务于大家。js硬往java上靠,显然不行嘛。

就算行也不现实,我是想让js先具备类似java的编码习惯,面向对象编程习惯而已,不再是跟以往一样直接一个function(){/* 做自己的事... */},而是先构思抽取对象模型。

以面向对象编程方式为基准,并在此之上作其他应用开发。
一個程序員 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xjl756425616 的回复:]

js本身就是面向对象,js的函数叫结构体函数,可以当成类来使用,也可以当成函数来用。
我不同意javascript是什么弱类型这种说法,它的语法很严谨。
包的概念当然有,js可以创建包,js有原型式继承
[/Quote]

对你的回复我有几点不同观点:
1、你说js本身就是面向对象,我说no,它是基于OO的。
先说面向对象的三大基本特征继承、封装、多态。而js只是具有封装性,继承只是js的原型链可以模仿到继承“样子”,仅仅是模仿,通过原型链做文章实现继承的框架很多很多,Ext就是这么做的。我也是这么实现的,但模仿和真正的继承是完全不同的两码事,当你深入了解js实现继承时更会明白。而多态呢?连继承都不行怎能多态?任何多态都是要建立在继承的基础之上,句柄类型必须用父类型或接口才能多态吧,js只能用var作声明,已经失去了多态性。所以说JS并非面向对象的语言。最准确的描述应该叫做“基于对象的事件驱动形动态语言”。 你可以去百度、google查查。

2、你说你不同意javascript是弱类型语言,我说你除了接受以外,还是接受。正应为它是弱类型语言,它的类型是随时可以被改变,导致它至今也没有一款强大的IDE开发环境,不像强类型语言,比如你声明一个int类型的变量,只能存放int值,但是弱类型语言却可以存放任意值且变量类型也随之改变。因此才叫动态语言。这和它语法严禁不严谨没有任何关系,说要语法严谨度,永远没办法和强类型语言比。

3、js没有包的概念,只有闭包的概念...
狄默默斯基 2011-09-05
  • 打赏
  • 举报
回复
js本身就是面向对象,js的函数叫结构体函数,可以当成类来使用,也可以当成函数来用。
我不同意javascript是什么弱类型这种说法,它的语法很严谨。
包的概念当然有,js可以创建包,js有原型式继承
一個程序員 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xjl756425616 的回复:]

引用楼主 diky87688973 的回复:
这就必须要让javascript具备OOP概念,而不仅仅是基于OO的事件驱动,因此注重的是编码规则(非字符编码,是编写代码)。


从这句话中可以看出楼主根本就是个不懂javascript语言的人,还在此妖言惑众。。。
[/Quote]

谢谢你的回复,我接受你的批评。

如果能给出更好的解释,将感激不尽。
狄默默斯基 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 diky87688973 的回复:]
这就必须要让javascript具备OOP概念,而不仅仅是基于OO的事件驱动,因此注重的是编码规则(非字符编码,是编写代码)。
[/Quote]

从这句话中可以看出楼主根本就是个不懂javascript语言的人,还在此妖言惑众。。。
0拓0 2011-09-05
  • 打赏
  • 举报
回复
正如LZ说的:
浏览器兼容问题基本上在ui层面,处理html元素的差异性,处理css样式的差异性。
而jQuery 最成功的地方就是解决了这些差异性。我从不相信有任何一个JS库不会涉及到和CSS相关的操作。
除非是node.js那样子,来写服务端的。
这种兼容性问题不解决,JS库一切无从谈起。

至于xj1756425616的说法,我真不敢恭维。我不知道你的电脑上面有几个浏览器,里面有没有IE6?
还是说,你写的一切JS根本就不兼容IE浏览器......
加载更多回复(31)

87,921

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧