基于类的面向对象的语言,如 Java 和 C++,建立于两个不同的实体概念之上:类(classes)和实例(instances)。 一个类定义所有的描述对象集合的属性(如 Java 中的方法的域,以及 C++ 中的成员及属性),它是个抽象的东西,不象对象所描述的特定成员; 一个实例是类的实际表现(题外话:如果您了解 FLASH 的话,那么这好象是 Symbol 和 Instance 的关系),即是它的成员。

   基于原型的语言如 JavaScript,没有这种区别,它只具有对象。一个基于原型的语言具有原型对象的概念,一个对象是一个模板,它为一个新对象提供最初的属性。任何对象都可以指定它自己的属性,不管是您创建的还是在运行时的。另外,任何对象都可以同另一个对象联合为一个原型,允许第二个对象分享第一个对象的属性。 定义一个类  在基于类的语言中,类的定义是在一个单独的类定义中进行,在类定义中您可以指定其特有的方法,称为构造函数来创建类的实例。一个构造函数可以为实例的属性指定初始值并在其创建时执行其它初始化工作。您可以用 new 操作符来动态地用构造函数创建类的实例。

  JavaScript 具有类似的模型,但没有与构造函数分离的类定义,而是定义一个构造函数来创建具有特定属性及其值的集合的对象。任何 JavaScript 函数都可以用作构造函数,您可以用 new 运算符和构造函数来创建一个新对象。 子类和继承  在一个基于类的语言,您可以通过类定义创建一个类的层次;在类定义中,您可以指定一个新类是一个已存在的类的子类。子类继承了父类的所有属性并可以有自己特定的新属性或修改它继承的属性。例如辅乳动物类有两个属性:会移动、会产子,而它的子类猫类又有一个新属性,它会“喵喵”叫,那么猫类就有三个属性:会移动、会产子、会“喵喵”叫。

  JavaScript 同样具有继承性,它允许您用构造函数来关联原型,但它与上例又有所不同,以上例的辅乳类来讲:首先您用构造函数定义辅乳动物,指定会移动、会产子两个属性;接下来定义猫构造函数,指定会“喵喵”叫这个属性,最后您为猫构造函数赋于一个新的辅乳动物对象,这时您就创建了一个新的猫对象,它继承了辅乳动物的两个属性。 添加和删除属性  在基于类的语言中,您是在编译时创建一个类,而在编译时或运行时来实例化一个类的实例。当定义了类后您不能再改变类属性的数目和类型。而在 JavaScript 中,您可以在运行时从任何对象中添加或删除属性,如果您为对象集合原型的一个对象添加了一个属性,那么该原型的所有对象同时获取了这个新属性。

总结基于类(Java)和基于原型(JavaScript)的对象体系比较 Java JavaScript 类和实例是不同的实体 所有对象都是实例 用类定义定义类,类的实例化用构造函数方法 用构造函数定义和创建对象集合 用 new 操作符创建一个对象 相同 用类定义来定义已存在的子类以构造一个对象的层次 用构造函数关联原型,并通过把对象赋予原型创建对象层次 通过类链来继承属性 通过原型链继承属性 类定义指定一个类中所有实例的属性,不能在运行时动态添加属性 构造函数或原型指定一套初始属性集合,可以动态地为单独对象或整个对象集合添加或删除属性

除非另有声明,本站遵循【署名-非商业性使用-相同方式共享 3.0 共享协议】授权。 转载原创文章请注明,转载自:Neeke[http://www.ineeke.com] 本文链接: http://www.ineeke.com/archives/381/