由定义来看,JavaScript是典型的AJAX语言。不同于Java,JavaScript并不强调OO风格的编码。然而,令人吃惊的是JavaScript居然全面支持所有的OO语言的主要属性:封装、继承和多态性。Douglas Crockford甚至称JavaScript是"世界上最易被误解的编程语言"。让我们回顾一下JavaScript的面向对象的地方吧。
数据类型
在Java中,一个类定义了一个数据和它的相关行为的组合。尽管JavaScript保留了class关键字,但是它不支持与常规OOP语言一样的语义。
这听起来可能觉得奇怪,但是在JavaScript中,对象是用函数来定义的。事实上,通过在下面的示例中定义一个函数,你就定义了一个简单的空类Calculator:
function Calculator() {}
一个新的实例的创建与在Java中相同-使用new操作符:
var myCalculator = new Calculator();
上面这个函数不仅定义一个类,而且还担当了一个构造器。在此,操作符new实现了这一魔术-实例化一个类Calculator的对象并且返回一个对象参考而不是只调用该函数。
创建这样的空类是没错,但在实际中并没有多大用处。下面,我们准备使用一个Java-脚本原型结构来填充类定义。JavaScript使用原型当作创建对象的模板。所有的原型属性和方法被参考引用地复制到一个类的每个对象中,所以它们都具有相同的值。你可以改变一个对象中的原型属性的值,并且该新值会覆盖从原型中复制过来的缺省值,但是这仅对于在一个实例中。下列语句将把一个新属性添加到Calculator对象的原型上:
Calculator.prototype._prop = 0;
既然JavaScript并没有提供一个方法来从句法上表示一个类定义,那么我们将使用with语句来标记该类的定义边界。这也将使得示例代码更为短小,因为该with语句被允许在一个指定的对象上执行一系列的语句而不需要限制属性。
function Calculator() {};
with (Calculator) {
prototype._prop = 0;
prototype.setProp = function(p) {_prop = p};
prototype.getProp = function() {return _prop};
}