简介
OurJS 是一个适用于 WEB 开发的 JavaScript 框架,它提供了覆盖面广、细节完善的功能,并能让开发者使用可预期的 API,写出具备良好的兼容性、可读性和扩展性的代码。
OurJS 完全兼容 PC 端的 IE6+、Firefox、Chrome、Safari、Opera 以及其他使用 Trident 和 WebKit 内核的浏览器。
特点
化繁为简 —— 以简单直接的方式,提供易于理解和使用的功能。
-
提供尽可能少的自定义 API。
一些标准(或已成为事实标准的) API 不能被所有浏览器兼容,因此 OurJS 为各浏览器做了补缺处理,以让尽可能多的标准 API 能够在各浏览器中通用。这样就不必提供具有类似功能的新 API 了,标准 API 更易于记忆和使用。
-
不模拟其他语言的“类”和“继承”的机制。
使用 JS 自身的特性为对象扩充功能更加直观和灵活,OurJS 不会刻意效仿其他语言的特性。
-
避免使用包装对象。
因此不必去关注原始对象与包装对象的区别,也不会出现误用的情况。要操作一个对象,直接调用它的方法或属性即可。
IE6 IE7 本来没有 Element 构造函数,但现在可以通过扩充 Element.prototype 来为页面上的 DOM 元素添加新特性了:
Element.prototype.newMethod = function() {...};
IE6 本来并不支持 CSS2 引入的固定定位,但现在支持了:
<div style="position: fixed; right: 0; bottom: 0;">...</div> <!-- 希望取消固定定位时,可以使用 element.setStyle/setStyles 方法修改 position 的值。 -->
IE6 IE7 IE8 的事件模型与其他浏览器不同,但现在可以通过 element.on/off/fire 方法来统一实现事件监听器的添加、删除及触发指定的事件了:
element.on('click', function(e) {...}); // 事件对象 e 也做了兼容性处理,因此在所有浏览器中也有一致的表现。
-
为常用的功能提供 Widgets 以简化开发。
Widget 是指一类特殊的元素,当一个元素成为 Widget 时,将具备新的行为,获得新的属性、方法,并能触发新的事件。
一些 Widgets 甚至不需要写任何脚本去初始化。如果要在页面内实现一个模态对话框,这样写就可以了:
<div id="notice" class="widget-dialog">...</div> ... <a href="javascript:$('#notice').open();">查看通知<a>
"Entities should not be multiplied unnecessarily." -- Occam's Razor
“如无必要,勿增实体。” —— 奥卡姆 剃刀定律"Everything should be made as simple as possible, but not simpler." -- Albert Einstein
“任何事情都应该尽可能的做到简单,简单到极致。” —— 爱因斯坦
功能完善 —— 提供的功能覆盖面广、细节完善,可以满足 WEB 开发中的绝大多数需求。
-
OurJS 提供的功能包括原生 JS 对象扩展、DOM 对象兼容性处理、客户端参数检测、数据存储、跨域通信、动画、远程请求、模版、Widgets 等。
-
每个功能都经过长期实践,细节更完善,设计粒度也更适合常见的场景。
风格一致 —— 提供的 API 与原生 JS 和 DOM 的语法习惯一致,便于理解和记忆。
-
OurJS 提供的 API 均与原生 JS 和 DOM 的风格一致,让开发者能够使用最流畅自然的语法来编写代码。
-
有共同点的方法、参数或对象也具备一致的名称,因此它们的行为也是可预期的。
-
Array 和 Object 的 forEach 方法的作用均为遍历。
它们的 callback、thisObj 参数的作用以及 callback 函数将被传入的参数也完全相同。
不同的是 Array 的 forEach 方法是实例方法,而 Object 的 forEach 则为静态方法。 -
cookie 和 localStorage 这两个与存储有关的对象都以 getItem、setItem 和 removeItem 方法来进行获取、修改和删除的操作。
并且它们的参数 key 和 value 都代表数据名和数据值,都是字符串类型。 -
DOM 对象和 JS 对象处理事件的方法均为 on、off 和 fire。
它们的 name 参数格式略有不同,因为 DOM 事件可以传递,因此有“代理”的概念。
它们的 listener 参数的含义和作用则完全一致,并且当 listener 被调用时,this 的值也均为被监听的对象。
-
易于扩展 —— 不论是要扩展框架本身,还是扩展应用,OurJS 均提供了简易的方式。
-
要为基础类型的对象扩展功能,扩展其构造器的 prototype 即可(不建议扩展 Object.prototype)。
OurJS 并没有提供特别的方法来做这件事情,使用 JS 固有的方式,可以让代码更加简单易读。
-
按照 OurJS 的 Widget 编写规范,可以根据需要随时添加新的 Widget,或扩展已有的 Widget 的功能。
使用 Widget 来实现的 UI 组件,只暴露一个 DOM 对象,可以降低使用分离的方式设计组件(需要同时管理表现层的 DOM 对象和逻辑层的 JS 对象)而增加的复杂度。
-
使用事件系统在各模块间通信。
OurJS 提供的事件模型可以处理任意多的事件类型,可以根据情况随时添加新的事件类型,并在对应的监听器中进行必要的处理。
另外,在 JSEventTarget 对象上使用事件监听,可以很容易的实现事件总线的功能,这可以为复杂的业务逻辑进行解耦,使代码更容易维护和扩展。
要求和限制
OurJS 要求浏览器运行在“标准模式”下。
-
这样可以确保开发者写出规范的代码,并获得更好的兼容性、发挥浏览器的最大功效。
-
当浏览器工作在非标准模式下时,开发者将在控制台中(如果有)收到一条警告信息。
浏览器运行的模式是由当前页面文档的 DTD 决定的,在页面文档的头部添加适当的 DTD 以启用浏览器的标准模式(推荐使用
<!DOCTYPE html>
)。
OurJS 不能和其他对原型进行了扩展的框架或类库共存。
-
当必须引入其他的框架1或类库2以满足特定需求时,要注意:OurJS 对原型进行了扩展3,因此不能和其他使用同样方式设计的框架共存4。
-
“框架”是指面向 WEB 应用的开发平台,通常会提供浏览器兼容性问题的解决方案、扩展语言功能、约定框架自身的扩展方法、提供梳理应用逻辑的模式等。
在一个 WEB 应用里,应避免使用多种框架。 -
“类库”是指为解决某一方面的问题而设计的工具集,它们应该是不依赖于任何框架的。
在一个 WEB 应用里,可以使用多种类库。 -
JavaScript 框架提供 API 的风格有三种:静态方法、包装对象和原型扩展。
为了提供流畅自然的语法,并保持 API 的一致性,OurJS 优先使用了“原型扩展”这种方式。
一些不适合使用“原型扩展”方式提供的的功能使用“静态方法”提供,如 Object.mixin,Date.parseExact 等。
只有事件对象使用了“包装对象”方式,目前只有这样做才能使事件对象在各浏览器中保持一致,并具备丰富的功能。 - 可以和 jQuery 共存。
数组的 forEach 方法是 ECMAScript 5 引入的,IE6 IE7 IE8 并不支持,只有在较新版本的浏览器中才能使用,但现在可以放心使用了:
ECMAScript 5 的 JSON 对象原本在 IE6 IE7 中是不支持的,在 IE8 中的实现也有问题,但现在它们都可以完美支持了:
HTML5 的 localStorage 对象原本在 IE6 IE7 中是不支持的,但现在它们支持了: