自从事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引入包的概念(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
但是javascript到目前为止 其在web中地位已然无法替代 楼主要把js生往java上靠 没有必要 只不过让有Java基础的人看上去更加熟悉罢了 但是有些地方js要比java处理起来更简单 比如js的继承
哈哈,咱们凭的就是对javascript的一腔热血。js为何经久不衰,就凭它使用灵活而言,已是任何强类型语言都无法替代。尽管如此,它也存在很多缺点。原生js内容太少,往往都是要自己扩展很多辅助函数来配合实际应用,或者借助第三方js库。而我就想实现一个第三方库,为了符合应用需要,不能一味的让编码倾向java,先得具备灵活轻巧的dom操作,不然会变成鸡肋。至于ui层面,ext就已经相当出众,它的风格类似java的swing。而我的想法是parseJava(javaSrcCode);直接将java代码生成javascript代码。在实现内部ui构造换成html元素。也许不现实,但没有甚么不可能。我最需要的是大伙的支持以及参与,剩下的就是时间。还是那话,我要做的是开放式第三方js库。当你有很好的idea或解决某特定问题的代码片段,都可以在Fan中找一个命名空间,将它融合在一起,让Fan更强大,更健壮。
parseCSharp(...) // C#
parseXXX(...)而在语法上,做一下适配工作,也能做到。这些都是后话。国内开放的js框架,你能用甚至扩展,尽管能够分享给别人,但是并不能将你的扩展合并到官方,以供其他人的需要。但是Fan可以,换句时髦的话,官方将定位在云端,而所有乐意参与的开发者就是云。是个技术汇聚的平台。其实很多人自己都有开发过实用性很强的组件,但是他们都是游离的,甚至只有自己一个人在使用。这么好的东西,为何不汇聚一起,正所谓独乐乐不如众乐乐。而且我觉得,作为一个开发者,分享自己的作品是一件非常愉快的事情。当你看到很多人在使用你开发的某个组件在实际应用当中,你将会得到更多的快乐、成就感,咱途的就是有所作为。不是吗?而选择java语法是因为使用的人多,我也是其中之一,OOP将作为Fan的基础(含量并不多),在此之上实现各种应用开发。
每次花在前台页面上的时间比后台多多了
最近整ExtJS 。整的心烦意乱。。
哎。。期待楼主的。~
从这句话中可以看出楼主根本就是个不懂javascript语言的人,还在此妖言惑众
我不同意javascript是什么弱类型这种说法,它的语法很严谨。
包的概念当然有,js可以创建包,js有原型式继承
对你的回复我有几点不同观点:
1、你说js本身就是面向对象,我说no,它是基于OO的。
先说面向对象的三大基本特征继承、封装、多态。而js只是具有封装性,继承只是js的原型链可以模仿到继承“样子”,仅仅是模仿,通过原型链做文章实现继承的框架很多很多,Ext就是这么做的。我也是这么实现的,但模仿和真正的继承是完全不同的两码事,当你深入了解js实现继承时更会明白。而多态呢?连继承都不行怎能多态?任何多态都是要建立在继承的基础之上,句柄类型必须用父类型或接口才能多态吧,js只能用var作声明,已经失去了多态性。所以说JS并非面向对象的语言。最准确的描述应该叫做“基于对象的事件驱动形动态语言”。 你可以去百度、google查查。2、你说你不同意javascript是弱类型语言,我说你除了接受以外,还是接受。正应为它是弱类型语言,它的类型是随时可以被改变,导致它至今也没有一款强大的IDE开发环境,不像强类型语言,比如你声明一个int类型的变量,只能存放int值,但是弱类型语言却可以存放任意值且变量类型也随之改变。因此才叫动态语言。这和它语法严禁不严谨没有任何关系,说要语法严谨度,永远没办法和强类型语言比。3、js没有包的概念,只有闭包的概念...
sorry,竟然漏了回复。非常感谢你的回复!心还是不能凉啊,凡事还是要抱点希望。万念俱灰的话就只剩下杯具了。国足其实也在努力,只是不见成效。parseJava其实是激励自己的一种美好幻想,即使实现也是蹩脚的很。我的想法是在囊括大家积累的心得,再服务于大家。js硬往java上靠,显然不行嘛。就算行也不现实,我是想让js先具备类似java的编码习惯,面向对象编程习惯而已,不再是跟以往一样直接一个function(){/* 做自己的事... */},而是先构思抽取对象模型。以面向对象编程方式为基准,并在此之上作其他应用开发。
凭着我之前学校学过一点java的只是来看,,所谓的包其实就是个文件夹,没那么玄乎!!!
我看一本书上描述,js中的包类似这种对象嵌套对象的写法。。
<script>
jscript=function(){};
jscript.ui=function(){};
jscript.ui.show=function(){
alert('success');
}
jscript.ui.show();
</script>
再说,我理解的面向对象,只要有“class”的概念,有this指针,有成员属性、函数,我就认为是面向对象,,微软说的几大特征我才不鸟它呢!
思路其实就是对象链模式,简单的几个步骤吧。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
我一直信奉Do more job with less codes
希望代码越简洁越好,个人感觉js往函数式这一边发展会更好。
/*命名空间函数*/
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属性更改原型方法。
他最根本的目的应该是浏览器的兼容问题
这个命名空间创建的果然够简洁,我写的是一个150行代码的。稍微复杂了些。你代码处有个地方不太妥window[s] = window[s] || {};
pre_s = window[s]; window[s]取出来的内容,先要进行判断是否属于命名空间,不然当我毫不知情的情况下创建一个叫util的命名空间,结果这个对象已经存在,但并非命名空间。
这个是一般不是自己一个人用,还是谨慎点好。真想把我现在实现Fan的部分代码贴出来,让大伙批评一下,以便改进,可惜TMD公司里不许发代码。回家了再贴
浏览器兼容问题基本上在ui层面,处理html元素的差异性,处理css样式的差异性。而js语言本身差异较小
浏览器兼容问题基本上在ui层面,处理html元素的差异性,处理css样式的差异性。
而jQuery 最成功的地方就是解决了这些差异性。我从不相信有任何一个JS库不会涉及到和CSS相关的操作。
除非是node.js那样子,来写服务端的。
这种兼容性问题不解决,JS库一切无从谈起。至于xj1756425616的说法,我真不敢恭维。我不知道你的电脑上面有几个浏览器,里面有没有IE6?
还是说,你写的一切JS根本就不兼容IE浏览器......
/**
*
* 创建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;
}
});
补充:
improt 只在需要时,才去服务器上拉文件下来,已经拉过的文件不会重复拉。发的是同步请求。
异步情况考虑过,所以又加入了一个deferImprot,异步请求去拉js文件。
function exec(command) {
try {
var wsh = new ActiveXObject("WScript.shell");
if(wsh) {
wsh.Run(command);
}
} catch (e) {
alert(e.message);
}
}
现在有一个问题,就是IE浏览器默认是阻止该行为的,想执行这段代码就要把浏览器的安全级别调低,能不能用JS先实现注册表的注册,让侯再执行这段代码,或者是其他的什么解决办法能让客户不用调整浏览器的安全级别,求指教!! 急
你这代码要是浏览器允许的话那就危险了,你要实现的应该只是做个测试吧?那我告诉你,js没权限执行浏览器设置,你要调用Active脚本,浏览器出于安全考虑一定要得到用户的确认,或者设置允许未授权的Active执行。要是哪款浏览器允许用js这么做,那这个浏览器你也不会再用。除非你能够百毒不侵。
json格式的JavaScript对象,比java风格的JavaScript对象用起来要灵活的多,简洁的多,可扩展性也会更好,不管方法还是属性,随时都可以增加、修改、删除,一个replace就有多种用法
var arr = []
str.replace(/\<a[^>]*>[^<]*<\/a>/gi,function(n){
arr.push(n);
});
//匹配出字符串中所有的a标记,并存入到数组当中上面的这种replace写法,或者说实现同样的功能,我还真不知道在java里面怎么写