一个javascript框架应有的功能

一个人学许多东西,不等于他会很多东西,学了也会忘的,学了也不等于会运用,这时我们应该整一个很复杂的东西出来,那么就知道自己到底去到什么程度。基于这样的理由,我开始搞框架了,像我群里面的许多人那样,因此请不要感到惊奇或敬佩什么的。我们总是免不了造轮子,前人走过路,我们也不得不走,只不过怀着不同的目的与心情。我也没有自大到想去挑战这个挑战那个,仅仅是想自食其力,或许其最好的结果是拿来与友人切磋切磋。于是掂量一下,总结如下,如果有好心人能迷津指点最好不过。

首先要模块化。像jQuery那样内部看起来乱成一团的类库,如果去github看一下,发现还是很有组织地分成几块。这样对逐个改进非常有利。当然如果与Ext,Base2,mootools比起来,jQuery肯定不合格。

二,风格要统一,像Prototype满眼是ruby标准库的方法名,mootools拥有许多$开头的方法,方法多是单个单词,jQuery的方法则是多为缩略语。我基本上跟Prototype走,但有些名字非常流行,我也会采纳的。总之,让大家一看就知这方法与属性是干什么。

三,不使用with,不对Object与DOM的原型进行扩展,不滥用try...catch与自动执行函数。

基于上面三条铁则,我开始设计我的类库。由于是模块化,因此它会把边沿的功能放置到其他JS文件中,核心功能置为一个文件。对,就像Ext,mootools那样。这样带来两个问题,其他JS文件怎么知道它是本类库的一部分,肯定要像Ext暴露一个不会变的全局变量,不能像jQuery那样使用noConflict处处退让。注意,我做的是框架,不是类库。它的功能体系应该具有足够的广度与深度来满足我们的需要,不能项目做到一半,发现它不够用,被逼搭上十几个插件或另一个框架,这样的项目维护起来很头痛。换言之,它拥有一个坚定不移的命名空间,像Ext或YUI那样。另一个问题是,如何加载那些子模块。像Ext那样实在太不人道,动不动都要自己加。虽然javascript模块的依赖关系肯定比不上java的,但我们不应该排除这种可能,如我们有一天牛起来,要实现一个WEB OS呢?!因此需要一个像dojo那样的包机制,功能不一定像它那样强悍,但一定要有。于是第一个功能就这样确定,拥有一个模块加载器。

第二个功能是拥有一个强大的类工厂。jQuery在这方面真是不行,没有类,做大一点的东西,这缺点就暴露出来了,代码非常难组织,别人也很难读懂你的代码。在这方面,mootools的实现是最漂亮的,这非常值得参考。

第三个功能是浏览器嗅探,不过尽量利用非UA技术来实现。各浏览器的navigator.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.mzph.cn/news/268274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

appcan UI

appcan UI 公共类 ([appcanUI框架地址:](http://newdocx.appcan.cn/UI/source) .ub {display: -webkit-box !important;display: box !important;position: relative; }.ub-rev {-webkit-box-direction: reverse;box-direction: reverse; }.ub-fh {width…

sql表字段类型尽量使用数值替代字符串类型

尽量使用数值替代字符串类型 比如性别(sex):0代表女,1代表男;数据库没有布尔类型, mysql 推荐使用 tinyint 1:因为引擎在处理查询和连接时会逐个比较字符串中每一个字符; 2:而对于数字型而言只…

问题步骤记录器——“懒教师”的好帮手

场景:电话响,接通电话,电话另一端:我的电脑又怎么怎么了,为什么我的***弄不出那样的效果?请问***要怎样操作?感悟:虽然不是大虾,但由于众多同学当中,我仍然靠…

问题账户需求分析

材料: 某大银行的一位银行卡办公室的收账经理Liz遇到了一个问题。她每周都收到一份过期未付款的账户名单。这份报告已经从两年前的250个账户增加到现在的1250个账户。为了确定那些严重拖欠债务的账户,Liz需要通读这份报告。严重拖欠债务的账户由几个不同…

SQL优化技巧使用varchar代替char

一:varchar 变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间; 二:char 按声明大小存储,不足补空格; 三:其次对于查询来说,在一个相对较小的字段内搜索&am…

显式调用构造函数产生的悲剧

昨天一个同学让我帮他调试程序,发现一个诡异的问题,明明一个类的私有成员被赋值了,但运行时却总是不定的值。仔细检查了好久,才发现原来他把构造函数当作普通函数进行了显式调用,结果产生了悲剧。将他的问题简单的抽象…

input输入框修改后自动跳到最后一个字符

<input class"m-form-control" onpaste"return false" placeholder"直播间名称" name"name" onkeyup"this.valuethis.value.replace(/[^\u4e00-\u9fa5|\u0000-\u00ff|\u3002|\uFF1F|\uFF01|\uff0c|\u3001|\uff1b|\uff1a|\u300…

CCNA配置试验之七 PPP中PAP和CHAP的验证

PPP支持NCPC&#xff08;网络控制协议&#xff09;和LCP&#xff08;链路控制协议&#xff09;PPP的验证方式分为PAP二次握手明文传输和CHAP三次握手密文传输。试验配置PAP和CHAP的验证&#xff1a;试验配置如下&#xff1a;R1&#xff08;CHAP&#xff09;Router>enRouter#…

sql优化批量插入性能提升

建议批量插入 批量提交 INSERT into book VALUES(5,"A"),(6,"B");多条提交 INSERT into book VALUES(5,"A"); INSERT into book VALUES(6,"B") 理由 默认新增SQL有事务控制&#xff0c;导致每条都需要事务开启和事务提交&#xff0…

2017.10.13java上机出现中的问题

此篇博文主要说明在这次上机中遇见的问题和解决方法。 实验一&#xff1a;计算机计算组合数 问题1&#xff1a;在递推的方法用杨辉三角计算中&#xff0c;我创建了二维数组&#xff0c;但二维数组的行和列数并不是m&#xff0c;而是m1&#xff0c;因为杨辉三角的第一行只有一个…

重装系统

终于重装了系统&#xff0c;装了几个软件还比较满意 一个没有广告的迅雷qq终于可以打开网页了完美解码可以硬解转载于:https://www.cnblogs.com/jetz/archive/2010/04/18/1714847.html

sql优化索引不宜建太多,一般5个以内

索引不宜太多&#xff0c;一般5个以内 索引并不是越多越好&#xff0c;虽其提高了查询的效率&#xff0c;但却会降低插入和更新的效率&#xff1b;索引可以理解为一个就是一张表&#xff0c;其可以存储数据&#xff0c;其数据就要占空间&#xff1b;索引表的数据是排序的&…

Unity3D学习(五):实现一个简单的视觉感知

前言 在很多第一人称或者第三人称射击游戏的单人模式中&#xff0c;玩家的乐趣往往来源于和各式各样的AI敌人的战斗。而战斗的爆发很多时候是因为这些AI在“看见”玩家后就会立即做出反应&#xff0c;比如开火、呼叫同伴、躲藏或者逃跑等。 所以这些AI到底是如何探测&#xff0…

BeanFactory中String FACTORY_BEAN_PREFIX = ““;解析

此接口定义了Bean的一些基本信息判断和获取bean比如 isSingleton isTypeMatch 还有一个需要注意的地方&#xff0c;看这个常量: String FACTORY_BEAN_PREFIX "&"; 如果我们在获取Bean的时候&#xff0c;使用&则获取的是FactoryBean本身对象&#xff0c;否则…

.NET Core简介

转载于:https://www.cnblogs.com/wxc-kingsley/p/7660878.html

Mysql数据库的瓶颈处理一点建议

Mysql数据库的瓶颈处理一点建议我们在使用Mysql数据库是常见的两个瓶颈是CPU和I/O的瓶颈&#xff0c;CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候。磁盘I/O瓶颈的出现呢发生在装入数据远大于内存容量的时候&#xff0c;如果应用分布在网络上&#xff0c;那么…

spring中DefaultListableBeanFactory是bean加载的核心部分,是spring注册和加载bean的默认实现方式

DefaultListableBeanFactory介绍 BeanFactory是个Factory&#xff0c;也就是IOC容器或对象工厂&#xff0c;而DefaultListableBeanFactory是Bean工厂的一个默认实现&#xff0c;DefaultListableBeanFactory提供了原始的BeanFactory的功能&#xff0c;如&#xff1a;对外提供ge…

使用MyBatis集成阿里巴巴druid连接池(不使用spring)

在工作中发现mybatis默认的连接池POOLED&#xff0c;运行时间长了会报莫名其妙的连接失败错误。因此采用阿里巴巴的Druid数据源&#xff08;码云链接 &#xff0c;中文文档链接&#xff09;。 mybatis更多数据源参考博客链接 。 1 环境 eclipse mars2 maven3.3.9 mysql5.7 2 …

捣鼓了一个月的SharePoint

从7月底到现在&#xff0c;对SharePoint有了比较大概的理解。除了文档管理、搜索功能&#xff0c;它的整合能力很强。由于我们缺少人手、理解有限&#xff0c;有没有这方面的专家愿意兼职有关SharePoint开发&#xff1f;请联系 towangjinshenghotmail.com私事&#xff1a;由于我…

docker search从Docker Hub查找(搜索)镜像

镜像搜索 docker search 名称 列表说明&#xff1a;NAME&#xff1a;镜像名(镜像仓库源的名称)DESCRIPTION&#xff1a;对该镜像的描述STARS&#xff1a;类似 Github 里面的 star&#xff0c;表示点赞、喜欢的意思OFFICIAL&#xff1a;是否 docker 官方发布AUTOMATED&#xff1…