Visit Mozilla.org

Core JavaScript 1.5 Guide:Class-Based vs. Prototype-Based Languages

From MDC


目录

[编辑] Class-Based vs. Prototype-Based Languages

基于类的面向对象语言,如Java和C++,是在两种独立实体概念的基础上建立起来的,它们分别是:类(class)和实例(instance)

  • 类定义了所有属性(包括Java中的方法method和作用域field,以及C++中的成员member),作为一组特定对象的特征元素。类是一个抽象的事物,比如,Employee类应该是所有雇员的集中抽象表现。
  • 另一方面,实例是一个类的实例化的产物,即类的一个成员。比如,Victoria可以使Employee类的一个成员,代表一个特定个体的雇员。一个实例的属性与生成它的类具有完全相同的属性(不会多,也不会少)。

基于原型的语言,比如JavaScript,却并没有上面所说的区别:它只简单地拥有对象。基于原型的语言有原型化对象的概念。一个对象被当作模版来使用,新的对象可以从模版中初始化属性。无论在你创建时或运行时,任何对象都可以制定它自己的属性。另外,对象还可以作为一个原型关联进其他的对象中。而且,允许第二个对象共享第一个对象的属性。

[编辑] 定义一个类

In class-based languages, you define a class in a separate class definition. In that definition you can specify special methods, called constructors, to create instances of the class. A constructor method can specify initial values for the instance's properties and perform other processing appropriate at creation time. You use the new operator in association with the constructor method to create class instances. 在基于类的语言中,你通过一个单独的类定义来定义一个类。在定义中,你可以设置构造函数来创建这个类的实例。构造函数可以在对象创建时初始化实例的成员和执行其它的操作。你可以通过new操作来创建一个类实例

JavaScript follows a similar model, but does not have a class definition separate from the constructor. Instead, you define a constructor function to create objects with a particular initial set of properties and values. Any JavaScript function can be used as a constructor. You use the new operator with a constructor function to create a new object. JavaScript也是相似的概念,但没有一个单独的类定义,相反,你可通过定义一个函数来创建一个对象并初始化属性和值。任何JavaScript函数都可当作构造函数,你只须用new操作一个函数便可创建一个对象

[编辑] 子类和继承

在基于类的语言中,你可以通过在类定义中,创建类的继承。在类定义中,你可以将新类指定为其他若干个已经存在的类的子类。子类将继承超类的全部属性,并可以增加新的属性,或改变那些继承来的属性。例如,假设Employee(雇员)类只包含name(名字)和dept(部门)属性,而Manager(经理)是Employee的子类,他可以增加reports(报告)的属性。在这个例子中,Manager类的实例将拥有全部三个属性:name,dept,和reports。

JavaScript允许你连接原型对象的构造函数的方法,并通过这种方式实现了继承机制。因此,你可以创建上例那种从Employee获得的Manager实例,但你使用的名字会稍有不同。另外,你可以定义Manager的构造函数,制定reports属性。最后,你也可以在实例化Manager时,指定那些从Employee继承来的属性。这时当你创建一个新的Manager的时候,它会从Employee继承得到name和dept属性。

[编辑] 增加和删除属性

在基于类的语言中,你通常会在编译时创建类,并在运行时或编译时创建类的实例。一旦类被定义完成,你将无法再改变类中属性的数量和类型。而在JavaScript中,你可以在运行时添加或者删除任何一个对象的属性。如果你在一系列对象运行时,给他们的原型类增加了一个属性,那么所有这些对象都会得到这个新的属性。

[编辑] Summary of Differences

下面的表格是对上面的不同点的一个整理。下面的部分详细阐述这些在javascript和java中的这些不同点。

基于类的语言(Java) 基于原型的语言 (JavaScript)
类和实例是独立的实体概念。 所有的对象都是实例。
使用类的定义语句来定义一个类;使用构造函数来实例化一个类 使用构造函数来定义和创建一系列对象
使用 new 操作符来创建一个对象 相同
使用类的定义语句来定义一个已存在类的子类,然后创建对象的层级关系。 使用构造函数类创建一个对象,通过指派原形化的对象并使其关联于已存在的构造函数Construct an object hierarchy by assigning an object as the prototype associated with a constructor function.
Inherit properties by following the class chain.

通过类来继承属性

Inherit properties by following the prototype chain.

通过原型来继承属性

Class definition specifies all properties of all instances of a class. Cannot add properties dynamically at run time.

类定义了实例的所有属性,不能在运行时动态添加

Constructor function or prototype specifies an initial set of properties. Can add or remove properties dynamically to individual objects or to the entire set of objects.

构造函数或者原型定义了属性的原始集合,可以在运行时动态的添加删除属性


« Previous Next »