自从事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

解决方案 »

  1.   

    首先 对楼主的想法表示肯定 相信此帖必火 
    但是javascript到目前为止 其在web中地位已然无法替代 楼主要把js生往java上靠 没有必要 只不过让有Java基础的人看上去更加熟悉罢了 但是有些地方js要比java处理起来更简单 比如js的继承 
      

  2.   


    哈哈,咱们凭的就是对javascript的一腔热血。js为何经久不衰,就凭它使用灵活而言,已是任何强类型语言都无法替代。尽管如此,它也存在很多缺点。原生js内容太少,往往都是要自己扩展很多辅助函数来配合实际应用,或者借助第三方js库。而我就想实现一个第三方库,为了符合应用需要,不能一味的让编码倾向java,先得具备灵活轻巧的dom操作,不然会变成鸡肋。至于ui层面,ext就已经相当出众,它的风格类似java的swing。而我的想法是parseJava(javaSrcCode);直接将java代码生成javascript代码。在实现内部ui构造换成html元素。也许不现实,但没有甚么不可能。我最需要的是大伙的支持以及参与,剩下的就是时间。还是那话,我要做的是开放式第三方js库。当你有很好的idea或解决某特定问题的代码片段,都可以在Fan中找一个命名空间,将它融合在一起,让Fan更强大,更健壮。
      

  3.   

    LZ,你让搞其他语言的同志情何以堪。另外,国内开放框架也是有的:淘宝KISSY,百度tangram, 腾讯好像是Jet
      

  4.   

    你做的,GWT已经完全实现了。并且GWT有很多完善的第三方插件,比如smartGWT。使用GWT的好处就是,页面上完全可以不出现jsp代码和服务器端插件。用完全java类的思想组装客户端js。
      

  5.   

    回复4、5、6楼:其他语言嘛...如果是面向对象的,语法上基本都差距不大。特别是C#与java,似对姐妹花。parseJava(...)
    parseCSharp(...) // C#
    parseXXX(...)而在语法上,做一下适配工作,也能做到。这些都是后话。国内开放的js框架,你能用甚至扩展,尽管能够分享给别人,但是并不能将你的扩展合并到官方,以供其他人的需要。但是Fan可以,换句时髦的话,官方将定位在云端,而所有乐意参与的开发者就是云。是个技术汇聚的平台。其实很多人自己都有开发过实用性很强的组件,但是他们都是游离的,甚至只有自己一个人在使用。这么好的东西,为何不汇聚一起,正所谓独乐乐不如众乐乐。而且我觉得,作为一个开发者,分享自己的作品是一件非常愉快的事情。当你看到很多人在使用你开发的某个组件在实际应用当中,你将会得到更多的快乐、成就感,咱途的就是有所作为。不是吗?而选择java语法是因为使用的人多,我也是其中之一,OOP将作为Fan的基础(含量并不多),在此之上实现各种应用开发。
      

  6.   

    楼主,强烈支持!我也是Java开发者。
    每次花在前台页面上的时间比后台多多了
    最近整ExtJS  。整的心烦意乱。。
    哎。。期待楼主的。~
      

  7.   

    可以借鉴JAVA的一些好的地方,但没必要硬去用JS实现一个JAVA,那样就没什么意义了,对于一个JS类库来说,它应该是一个JS类库,而不是一个JS版的JAVA开发环境。何况JAVA整个那一套对于JS类库的功能来说,不可能完全适合。其实类库这些,早些年国内的大中公司一直都有各自一套(无论是完全自研,还是在PROTYPE等基础类库基础之上扩展的),即使不见得都比JQ强很多,但也不是差太多,只不过都是内部使用,而且作为商业机密材料予以保护,离职签订协议不得外泄,否则发现就要赔款的。而JQ,十分好用不说,它还是免费的,这一点起到的影响非常巨大,普通人也都可以使用很良好的接近企业级的类库了。但也从这一点上,说明我们的国情如此,我们还没有地道的中国CPU,中国操作系统,中国编程语言(E语言,看来只象是一个汉化版的VB,尽管作者说绝非如此,但的确看来太象,没有真正的特色,而且作者也不可能否认至少灵感来源于彼),……很多很多,包括我们的男足还是那么水。到这件事情上,我感觉也是一样的。不是人不行,是环境不是做事的环境。如果是的话,不用楼主你说,早就出来了。既然不是,也绝非是你一个人的力量能改变的,我的心就早凉了。
      

  8.   


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

  9.   

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

  10.   


    对你的回复我有几点不同观点:
    1、你说js本身就是面向对象,我说no,它是基于OO的。
    先说面向对象的三大基本特征继承、封装、多态。而js只是具有封装性,继承只是js的原型链可以模仿到继承“样子”,仅仅是模仿,通过原型链做文章实现继承的框架很多很多,Ext就是这么做的。我也是这么实现的,但模仿和真正的继承是完全不同的两码事,当你深入了解js实现继承时更会明白。而多态呢?连继承都不行怎能多态?任何多态都是要建立在继承的基础之上,句柄类型必须用父类型或接口才能多态吧,js只能用var作声明,已经失去了多态性。所以说JS并非面向对象的语言。最准确的描述应该叫做“基于对象的事件驱动形动态语言”。 你可以去百度、google查查。2、你说你不同意javascript是弱类型语言,我说你除了接受以外,还是接受。正应为它是弱类型语言,它的类型是随时可以被改变,导致它至今也没有一款强大的IDE开发环境,不像强类型语言,比如你声明一个int类型的变量,只能存放int值,但是弱类型语言却可以存放任意值且变量类型也随之改变。因此才叫动态语言。这和它语法严禁不严谨没有任何关系,说要语法严谨度,永远没办法和强类型语言比。3、js没有包的概念,只有闭包的概念...
      

  11.   


    sorry,竟然漏了回复。非常感谢你的回复!心还是不能凉啊,凡事还是要抱点希望。万念俱灰的话就只剩下杯具了。国足其实也在努力,只是不见成效。parseJava其实是激励自己的一种美好幻想,即使实现也是蹩脚的很。我的想法是在囊括大家积累的心得,再服务于大家。js硬往java上靠,显然不行嘛。就算行也不现实,我是想让js先具备类似java的编码习惯,面向对象编程习惯而已,不再是跟以往一样直接一个function(){/* 做自己的事... */},而是先构思抽取对象模型。以面向对象编程方式为基准,并在此之上作其他应用开发。
      

  12.   


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

  13.   


    思路其实就是对象链模式,简单的几个步骤吧。step 1: 创建包的构造,不能自定义关键字(package com.csdn.bbs.javascript;),只能用方法代替
    package('com.csdn.bbs.javascript');step 2:分解传入的包名,以“.”点进行切割
    得出:com csdn bbs javascript 四个字符串step 3:关系构建,分解出的每一个字符串,都视为一个节点,并且能关联到下一个节点和上一个节点。
    即:com节点的子节点为csdn,bbs节点的父节点为csdnstep 4:将节点抽取成对象,并附载在一个function上
    如:
    node = function(){};
    node.name:'com';
    node.next:com.csdn;
    node.parent:null;
    可以加你认为更需要的属性或者标识。step 5:从首节点开始创建,com --> csdn --> bbs --> javascript
    但是创建前需要进行判断packageExist(com),避免创建的包
    csdn = new node();
    csdn.name = 'csdn';
    csdn.parent = com;
    csdn.allName = 'com.csdn';
    ...over
      

  14.   

    友情支持
    我一直信奉Do more job with less codes
    希望代码越简洁越好,个人感觉js往函数式这一边发展会更好。
      

  15.   

    包,有必要那么复杂用function吗,无非就是个namespace函数:
    /*命名空间函数*/  
    var namespace = function(ns){  
        if(typeof ns !== 'string'){  
            throw new Error('namespace must be a string');  
        }  
          
        var ns_arr = ns.split('.'),  
            s      = ns_arr[0], pre_s,  
            i      = 1;  
          
        window[s] = window[s] || {};  
        pre_s = window[s];  
          
        for (len = ns_arr.length; i < len; ++i) {  
            s = ns_arr[i];  
            pre_s[s] = pre_s[s] || {};  
            pre_s = pre_s[s];  
        }  
    };  
      
    /*使用方式*/  
    namespace('Util.EventUtil');  
      
    /*Event Code*/  
    Util.EventUtil.getTarget = function(){};  
    另外,面向对象三大特性:
        继承,原型继承难道就不是继承么,传统的语言叫类式继承,只不过方式不一样罢了,原型继承通过对象   实施,类式继承通过类实施。 如果有不解,可以参考GOF的设计模式。   多态,在传统语言中通过基类引用或指针指向子类,根据实际类型调用相关的方法。JS中,无非是统一为一个var类型, 你把var xx当基类类型,把子对象赋值给它, 不一样可以根据实际类型调用相关的方法么。这难道不是多态? 难道多态的定义会是根据语言强弱类型来定义的?  封装, 我得承认,在JS中确实没有private和protected这种东西,不过你想实现private也容易,闭包就可以。如果说JS在面向对象中有何缺点,我想最大的毛病就是,实例化的对象可以通过原型链中的constructor属性更改原型方法。
      

  16.   

    我认为,开发JS库最根本的目的,不应该是简化JS的代码书写规范(这个表达可能有点不够准确)
    他最根本的目的应该是浏览器的兼容问题
      

  17.   


    这个命名空间创建的果然够简洁,我写的是一个150行代码的。稍微复杂了些。你代码处有个地方不太妥window[s] = window[s] || {};  
    pre_s = window[s];
     window[s]取出来的内容,先要进行判断是否属于命名空间,不然当我毫不知情的情况下创建一个叫util的命名空间,结果这个对象已经存在,但并非命名空间。
      

  18.   


    这个是一般不是自己一个人用,还是谨慎点好。真想把我现在实现Fan的部分代码贴出来,让大伙批评一下,以便改进,可惜TMD公司里不许发代码。回家了再贴
      

  19.   


    浏览器兼容问题基本上在ui层面,处理html元素的差异性,处理css样式的差异性。而js语言本身差异较小
      

  20.   

    正如LZ说的:
    浏览器兼容问题基本上在ui层面,处理html元素的差异性,处理css样式的差异性。
    而jQuery 最成功的地方就是解决了这些差异性。我从不相信有任何一个JS库不会涉及到和CSS相关的操作。
    除非是node.js那样子,来写服务端的。
    这种兼容性问题不解决,JS库一切无从谈起。至于xj1756425616的说法,我真不敢恭维。我不知道你的电脑上面有几个浏览器,里面有没有IE6?
    还是说,你写的一切JS根本就不兼容IE浏览器......
      

  21.   

    关于包, 我其实想问你的是, 你的代码的物理位置是分散在多个文件里面的吗? 如果不是, 那是否会导致创建一个宏大的js文件? 如果不是,分散在多个文件里面的话,main文件如何加载其他的js文件(包), 是直接在html页面添加 <script />标签,还是用异步(?同步)请求包的代码片断? 
      

  22.   

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

  23.   

    不是很赞同,原本对jq的庞大与复杂的调用就比较不耐烦,在一些对性能与效率需求比较严格的项目里(例如JS游戏),多半还是直接写些原生的代码更好,虽然会在一些代码上做封装,但绝对不会为了代码观感去绕远路,具体项目具体分析,
      

  24.   


    /**
     * 
     * 创建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;
    }
    });
      

  25.   


    补充:
    improt 只在需要时,才去服务器上拉文件下来,已经拉过的文件不会重复拉。发的是同步请求。
    异步情况考虑过,所以又加入了一个deferImprot,异步请求去拉js文件。
      

  26.   

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

    }
    现在有一个问题,就是IE浏览器默认是阻止该行为的,想执行这段代码就要把浏览器的安全级别调低,能不能用JS先实现注册表的注册,让侯再执行这段代码,或者是其他的什么解决办法能让客户不用调整浏览器的安全级别,求指教!! 急
      

  27.   


    你这代码要是浏览器允许的话那就危险了,你要实现的应该只是做个测试吧?那我告诉你,js没权限执行浏览器设置,你要调用Active脚本,浏览器出于安全考虑一定要得到用户的确认,或者设置允许未授权的Active执行。要是哪款浏览器允许用js这么做,那这个浏览器你也不会再用。除非你能够百毒不侵。
      

  28.   

    搞不懂为什么那么多人喜欢用java来写JavaScript,JavaScript有很多优点是java无法比例的,特别是在灵活性上。
    json格式的JavaScript对象,比java风格的JavaScript对象用起来要灵活的多,简洁的多,可扩展性也会更好,不管方法还是属性,随时都可以增加、修改、删除,一个replace就有多种用法
    var arr = []
    str.replace(/\<a[^>]*>[^<]*<\/a>/gi,function(n){
       arr.push(n);
    }); 
    //匹配出字符串中所有的a标记,并存入到数组当中上面的这种replace写法,或者说实现同样的功能,我还真不知道在java里面怎么写
      

  29.   

    <i>LZ</i><b>V5</b>  Do more job with less codes
      

  30.   

    LZ V5 Do more job with less codes