Создание иерархии
Есть несколько способов определить подходящий конструктор функции для реализации иерархии
Employee. Какой из них выбрать, во многом зависит от того, что ваше приложение должно делать.
В этом разделе показано, как использовать очень простые (и сравнительно гибкие) определения, чтобы продемонстрировать работу наследования. В этих определениях вы не можете специфицировать никаких значений свойств при создании объекта. Вновь создаваемый объект просто получает значения по умолчанию, которые вы позднее можете изменить.
В реальном приложении вы, вероятно, определите конструкторы, которые позволят вам предоставлять значения свойств во время создания объекта (см. Более Гибкие Конструкторы). Эти простые определения демонстрируют появление наследования.
Определения Объекта Employee
Следующие определения
Java и
JavaScript для
Employee сходны. Единственным отличием является то, что в
Java вы должны специфицировать тип каждого свойства, а в
JavaScript – нет, и что вам нужно создать явно метод-конструктор для
Java-класса.
JavaScript | Java |
function Employee () {
this.name = "";
this.dept = "general";
}
| public class Employee {
public String name;
public String dept;
public Employee () {
this.name = "";
this.dept = "general";
}
} |
Определения
Manager и
WorkerBee показывают отличия в специфицировании более высокого объекта в иерархии. В
JavaScript вы добавляете прототипичный экземпляр как значение свойства прототипа конструктора функции. Вы можете сделать это в любое время после определения конструктора. В
Java вы специфицируете суперкласс в определении класса. Вы не можете изменить суперкласс вне определения класса.
JavaScript | Java |
function Manager () {
this.reports = [];
}
Manager.prototype = new Employee;
function WorkerBee () {
this.projects = [];
}
WorkerBee.prototype = new Employee;
| 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. Объект этих типов имеет свойства всех объектов, стоящих выше него в цепи иерархии. Кроме того, эти определения переопределяют наследуемое значение свойства dept новым значением, специфичным для объекта.
JavaScript | Java |
function SalesPerson () {
this.dept = "sales";
this.quota = 100;
}
SalesPerson.prototype = new WorkerBee;
function Engineer () {
this.dept = "engineering";
this.machine = "";
}
Engineer.prototype = new WorkerBee;
| 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 = "";
}
} |
Используя эти определения, вы можете создать экземпляры этих объектов, которые получают значения по умолчанию для своих свойств. Рисунок иллюстрирует использование этих определений
JavaScript для создания новых объектов и показывает также значения свойств новых объектов.
Примечание
Термин instance\экземпляр имеет специфическое техническое значение в языках на базе классов. В этих языках экземпляр является отдельным членом/member класса и фундаментально отличается от класса. В
JavaScript «экземпляр» не имеет этого технического значения, поскольку
JavaScript не имеет различий между классами и экземплярами. Однако, говоря о
JavaScript, «экземпляр» может использоваться неформально, являясь объектом, созданным с использованием определённого конструктора функции. Так, в этом примере вы можете неформально сказать, что
jane это экземпляр объекта
Engineer. Аналогично, хотя термины parent\родитель, child\дочерний, ancestor\предок и descendant\потомок не имеют формальных значений в
JavaScript, вы можете использовать их неформально для ссылки на объекты выше или ниже в цепочке прототипов.
Создание Объектов с Помощью Простых Определений