一个javascript框架应有的功能
一个人学许多东西,不等于他会很多东西,学了也会忘的,学了也不等于会运用,这时我们应该整一个很复杂的东西出来,那么就知道自己到底去到什么程度。基于这样的理由,我开始搞框架了,像我群里面的许多人那样,因此请不要感到惊奇或敬佩什么的。我们总是免不了造轮子,前人走过路,我们也不得不走,只不过怀着不同的目的与心情。我也没有自大到想去挑战这个挑战那个,仅仅是想自食其力,或许其最好的结果是拿来与友人切磋切磋。于是掂量一下,总结如下,如果有好心人能迷津指点最好不过。
首先要模块化。像jQuery那样内部看起来乱成一团的类库,如果去github看一下,发现还是很有组织地分成几块。这样对逐个改进非常有利。当然如果与Ext,Base2,mootools比起来,jQuery肯定不合格。
二,风格要统一,像Prototype满眼是ruby标准库的方法名,mootools拥有许多$开头的方法,方法多是单个单词,jQuery的方法则是多为缩略语。我基本上跟Prototype走,但有些名字非常流行,我也会采纳的。总之,让大家一看就知这方法与属性是干什么。
三,不使用eval与with,不对Object与DOM的原型进行扩展,不滥用try...catch与自动执行函数。
基于上面三条铁则,我开始设计我的类库。由于是模块化,因此它会把边沿的功能放置到其他JS文件中,核心功能置为一个文件。对,就像Ext,mootools那样。这样带来两个问题,其他JS文件怎么知道它是本类库的一部分,肯定要像Ext暴露一个不会变的全局变量,不能像jQuery那样使用noConflict处处退让。注意,我做的是框架,不是类库。它的功能体系应该具有足够的广度与深度来满足我们的需要,不能项目做到一半,发现它不够用,被逼搭上十几个插件或另一个框架,这样的项目维护起来很头痛。换言之,它拥有一个坚定不移的命名空间,像Ext或YUI那样。另一个问题是,如何加载那些子模块。像Ext那样实在太不人道,动不动都要自己加。虽然javascript模块的依赖关系肯定比不上java的,但我们不应该排除这种可能,如我们有一天牛起来,要实现一个WEB OS呢?!因此需要一个像dojo那样的包机制,功能不一定像它那样强悍,但一定要有。于是第一个功能就这样确定,拥有一个模块加载器。
第二个功能是拥有一个强大的类工厂。jQuery在这方面真是不行,没有类,做大一点的东西,这缺点就暴露出来了,代码非常难组织,别人也很难读懂你的代码。在这方面,mootools的实现是最漂亮的,这非常值得参考。
第三个功能是浏览器嗅探,不过尽量利用非AU技术来实现。各浏览器的avigator.userAgent都在撒谎,非常不可靠。事实上,不用AU,我与群里的朋友找得许多更好的替代品。mootools的思路基本与我的一致,需要自豪一下。
第四个功能是类型识别,像jQuery只提供了很少实现,isArray与isFunction,非常不够用,有时我们还要判定字符串数字呢!不过,jQuery1.4中提供了一个isPlainObject,用于深拷贝,这函数要盗窃一下。
第五个功能是特征侦测,基本上用作内部方法。这个我有专文介绍。
第六个功能是扩展一下一些原生对象。让原生对象也能漂亮的“链”起来。暂定对象为Array,String,Number,Function。
第七个功能是提供一个选择器,我已经实现了一个,正好为它找个好归宿。做了一个框架,动不动要借用人家的选择器非常可悲,这里特意点明批评一下Prototype1.7rc同学,实在太让我失望了。
第八个功能是处理文档,指创建节点,插入节点,替换节点,删除节点与复制节点。创建节点中利用innerHTML可以大大提高效率。删除节点方面,innerHTML在IE下又立功了,具体见我另一篇博文《IE中的 DOM 超空间与innerHTML》
第九个功能是遍历文档,指给定一个节点,找到其左邻右邻五姑六婆,具体可参考一下jQuery的API。
第十个功能是设置与获取元素节点的属性与样式。对className的操作也列入此模块。
第十一个功能是异步调用,换言之是Ajax,对于不同源者,还要用上动态script。JSON的相关处理也列入此模块。
第十二个功能是事件处理,主要工作是处理浏览器的差异性,二是提供一个观察者模块,实现自定义事件,三是提供一个(内存)缓存系统。
第十三个功能是对元素进行变形操作,以及基于其上的特效。具体可参考mootools的API。
第十四个功能是提供本地储存,利用一切可用的资源,如cookie与userData,HTML5还带来许多好东西。
第十五个功能是提供一个列队机制,这应该像dojo或Mochikit的Deferred模块,而不是jQuery那个简单的queue与delay。
第十六个功能是统一对XML的操作。
嘛,基本上是这样,功能很多,不过由于是对原生对象进行了原型扩展,许多方法会写得很精简的。如有什么好建议不妨提出来我听听。
原文:http://www.cnblogs.com/rubylouvre/archive/2010/04/08/1706888.html