随着Web技术的发展,JavaScript已经从最初的简单页面交互脚本语言,发展成为一个功能强大的应用编程语言。在Web 2.0和即将到来的Web 3.0时代,JavaScript的角色愈发重要。面向对象编程(OOP)作为一种结构化、可重用和可维护的软件开发方法,其在图形用户界面、领域建模等方面的应用已经证明是非常有效的。
然而,JavaScript并非一个传统的面向对象编程语言,它是基于原型的,这使得它在面向对象特性的支持上显得有些力不从心。为了弥补这一缺陷,jOOPL库应运而生。
jOOPL,全称"JavaScript Object-Oriented Programming Library",是一个轻量级、易于使用的面向对象编程库。它允许JavaScript开发者利用更高级的特性,如继承、多态、封装和组合等,来构建结构化、可重用和可维护的软件。
jOOPL不涉及DOM操作、DOM事件处理或AJAX等任务,它专注于提供面向对象编程的核心功能。jOOPL是完全开源的,并且遵循Apache v2许可证。
下面是一个简单的示例,展示了如何使用jOOPL在标准JavaScript中实现面向对象编程。考虑一个常见的二维多边形示例:三角形、正方形、五边形等。它们都是多边形,并且有不同的面积计算公式。因此,可以创建一个名为"Polygon"的类,它有一个多态方法来计算总面积。
// 首先,声明一个命名空间
$namespace.register("Joopl.Samples");
// 接下来,设计整个类
Joopl.Samples.Polygon = $class.declare(
function() {
this.$_.args = null; // 推荐:如果在构造函数中声明类字段,它将持有默认值而不是undefined
},
{
set_Args: function(value) { this.$_.args = value; },
get_Args: function() { return this.$_.args; },
CalculateArea: function() { }
}
);
在jOOPL中,有一些保留关键字,它们都以美元符号($)开头。这些关键字可能是快捷函数或完整的对象。在例子中,$namespace和$class是管理JavaScript代码中的命名空间和类的对象。
任何代码文件都应该注册它所属的命名空间。如果命名空间已经被声明,jOOPL将跳过命名空间注册。命名空间是JavaScriptWeb浏览器脚本中顶级对象Window的子对象。
关于类声明,$class关键字持有一个类管理对象,在这种情况下,使用declare方法。这个方法可以接受以下参数(按顺序):类构造函数(必需)、方法(必需)、基类(可选)和接口(可选)。
现在,假设想要实现一个名为"Rectangle"的多边形。为了正确实现它,需要矩形的尺寸(x, y)以及重写CalculateArea方法以实现Rectangle特定的面积计算。
$namespace.register("Joopl.Samples");
Joopl.Samples.Rectangle = $class.declare(
function() { },
{
CalculateArea: function() {
if (this.get_Args() && this.get_Args().x && this.get_Args().y) {
return this.get_Args().x * this.get_Args().y;
} else {
throw Error("Please give X and Y!");
}
}
},
Joopl.Samples.Polygon
);
使用$new关键字和快捷函数,实例化一个矩形,然后设置参数以计算面积。
var someRectangle = $new(Joopl.Samples.Rectangle);
someRectangle.set_Args({ x: 10, y: 20 });
var result = someRectangle.CalculateArea();
上述代码并没有展示多态性(但它确实展示了继承)。现在让想象一下,在基类中添加一个名为OutputArea的新方法,它将计算某个多边形的面积结果写入文档:
$namespace.register("Joopl.Samples");
Joopl.Samples.Polygon = $class.declare(
function() {
this.$_.args = null;
},
{
set_Args: function(value) { this.$_.args = value; },
get_Args: function() { return this.$_.args; },
CalculateArea: function() { },
OutputArea: function() {
document.write(this.$_.$derived.CalculateArea());
}
}
);
使用$new关键字和快捷函数,再次实例化一个矩形并设置参数以计算面积。
var someRectangle = $new(Joopl.Samples.Rectangle);
someRectangle.set_Args({ x: 10, y: 20 });
someRectangle.OutputArea();
OutputArea方法调用更专业的CalculateArea方法的版本。如上代码所示,jOOPL提供了保留的内置字段this.$_.$derived,以便访问派生类的成员。访问基类中的方法(例如this.CalculateArea())仍然是有效的,但它调用的是封闭类版本。
可以在jsFiddle上实时查看这个示例。
这只是jOOPL潜力的一小部分。jOOPL几乎支持面向对象编程的所有特性,并且它为JavaScript带来了巨大的好处。因为它不使用任何Web浏览器特性——只是纯JavaScript——jOOPL可以在任何JavaScript解释器或编译器中工作,这意味着jOOPL是一个平台无关的面向对象编程解决方案!