自从ajax技术兴起之后,开源界就出现了很多著名的JS框架。包括Google的Gmap等一系列,雅虎的YUI,还有就Jquery, Prototype等。使用这些框架就可以用简单的代码来实现丰富多彩的功能,有很多甚至是采用了类似面向对象的编程风格。
其实只要了解了Javascript的相关基础知识,我们完全可以自己写一个JS框架出来。本文介绍了搭建JS框架的基本原则。(ITcast上的教程-构建自己的JS库的学习笔记)
Jquery,Prototype等框架流行的原因
________________________________________
总结原因有三:
- 跨浏览器
屏蔽了浏览器的不同(类型,版本),毕竟,为市面上的每一款浏览器编写针对性的代码是极其不合算的
- 经过了严密的测试
代码的品质可以保证(这也是大多数流行的开源框架的优点)
- 设计合理
调用这些框架的代码也会非常的清晰,易懂
因此我们自己要写JS框架的话,也应该以上面的内容为目标。
构建注意事项
________________________________________
- 不要使用浏览器检测,要使用能力检测
“版本检测”,“浏览器嗅探“是javascript最佳实践中的错误用法。
我们不可能为了市面上每一款前途未卜的浏览器进行验证。
浏览器检测的最佳实践:能力检测(对象检测)
即在代码执行之前,检测某个脚本对象或方法是否存在(使用if(xxx.xxxx)的方式)。
- 使用命名空间
真正的命名空间在JavaScript2才支持,现在所谓的命名空间只是在脚本内部构造了一个小空间。
原因:避免调用多个JS库时,出现同名函数的冲突
JavaScript支持同名函数,但只使用最后一个函数(不支持重载,不会考虑参数,只看方法名字),
哪一个最后被加载,哪一个就会被调用到。
所以不使用命名空间的话,就很容易遇到同名函数冲突的问题。
现行Javascript的命名空间的原理
我们调用的Javascript其实默认都是注册在window对象上的,我们利用javascript中的对象,构建一连串的对象,并且每一个低级的对象作为上一级对象的属性。
比如说,我们要使用”a.b.c”来构建一个命名空间,其实就是先构建一个名字为a的对象,然后构建一个名字为b的对象,并且把这个对象作为a的属性,同样把c作为b的一个属性。即:
var a = new Object();// or var a = {};
a.b = new Object();
a.b.c = new Object();
使用命名空间的两点原则:唯一性,不共享
唯一性
挑选一个独一无二的命名空间的名字(如Google Maps的G),注意js是大小写敏感的
不共享
为了不与著名的一些库或者其他已有的一些函数冲突,使用匿名函数。
(function () {
// your code
}) ();
匿名函数实现了代码的不共享,该块中的function和function内部定义的函数都不会被其他地方直接调用到。
一个基本的示例:
(function() { window['test'] = {} function $() { alert("function $ called!"); } window['test']['$'] = $; }) ();
function内部的代码,第一行把test这个命名空间注册到了window上,中间定义了一个名字为$的内部函数,最后一句把$这个方法注册到了test这个对象上。
调用时,使用 test.$(“xxx”) 就可以。