网络编程
位置:首页>> 网络编程>> JavaScript>> [翻译]JavaScript中对象的层次与继承(3)

[翻译]JavaScript中对象的层次与继承(3)

作者:chenzhe 来源:chenzhe 发布时间:2008-12-31 13:36:00 

标签:类,对象,继承,javascript,编程

    
创建层次

要定义合适的构造函数以实现Employee层次,你有多种方式可以使用。如何选择在很大程度上取决于你想要在你的应用(application)中能够做些什么事情。我们稍后再来讨论这个问题。

就现在而言,我们使用非常简单的(相对来讲也是灵活的)定义,这仅仅是为了看看继承是如何工作的。在这些定义中,你不能在新创建一个对象的时候设置任何属性值。新创建的对象仅仅是取得默认值,你可以稍后再修改这些属性。图2展示了这种简单定义的层次。
在实际的应用中,你可能定义允许你在创建对象的同时指定属性值的构造函数。我们会在后面的"更加灵活的构造函数"部分介绍实现方法。现在,这些简单的定义可以让我们观察到继承是如何发生的。

以上定义看起来的样子What the definitions look like

图 2

如下,Java和JavaScript简单的Employee定义非常相似。唯一的不同就是在Java中,你需要指定属性的类型,而在JavaScript中不需要,而且你需要给Java类定义一个明确的(explicit,显式)的构造函数。

程序代码
javascript的方法

function Employee () {
  this.name = "";
  this.dept = "general";
}

程序代码
java的方法

public class Employee {
  public String name;
  public String dept;
  
  public Employee () {
    this.name = "";
    this.dept = "general";
  }
}

Manager 与 WorkerBee 的定义显示了,在构建继承链条中更高层对象的方式中的不同。在JavaScript中,你将一个原型实例设置为构造函数的prototype属性。你可以在定义了构造器之后的任何时间来完成这项工作。在Java中,你在类定义中指定超类(superclass)。你不能在类定义之外改变超类。

程序代码
javascript的方法

function Manager () {
  this.reports = [];
}
Manager.prototype = new Employee;function WorkerBee () {
  this.projects = [];
}
WorkerBee.prototype = new Employee;

程序代码
java的方法

public class Manager extends Employee {
  public Employee[] reports;
  public Manager () {
    this.reports = new Employee[0];
  }
}
public class WorkerBee extends Employee {
  public String[] projects;
  public WorkerBee () {
    this.projects = new String[0];
  }
}

Engineer和SalesPerson的定义从WorkerBee继承下来的对象,自然也是从Employee继承而来。这些类型的对象拥有所有在链条上游对象(objects above it in the chain)的属性

javascript的方法

function SalesPerson () {
  this.dept = "sales";
  this.quota = 100;
}
SalesPerson.prototype = new WorkerBee;

function Engineer () {
  this.dept = "engineering";
  this.machine = "";
}
Engineer.prototype = new WorkerBee;

java的方法

public class SalesPerson extends WorkerBee {
  public double quota;
  public SalesPerson () {
    this.dept = "sales";
    this.quota = 100.0;
  }
}
public class Engineer extends WorkerBee {
  public String machine;
  public Engineer () {
    this.dept = "engineering";
    this.machine = "";
  }
}

使用这些定义,你可以创建这些对象的实例,而这些实例会获得属性的默认值。图3展示了使用以上JavaScript定义新对象和这些新对象的属性值。

注意:正如之前描述的,实例(instance)这个词汇在基于类的语言中有特殊的技术含义。在这些语言中,一个实例是一个类的个体成员,是从根本上不同于类的。在JavaScript中,“实例”并没有这个技术含义,因为JavaScript没有类和实例的区别。以后再谈论JavaScript的时候,“实例”可以被用来非正式地指代用某个特定构造函数创建的一个对象。所以,在这个例子中,你可以非正式地说jane是Engineer类的一个实例。相似的,尽管父亲(parent)、儿子(child)、祖先(ancestor)、后代(descendant)这些词汇在JavaScript中同样没有正式的意义,我们仍然可以非正式地使用他们来指代原型链中位置或高或低的对象。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com