[翻译]JavaScript中对象的层次与继承(3)
作者:chenzhe 来源:chenzhe 发布时间:2008-12-31 13:36:00
创建层次
要定义合适的构造函数以实现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中同样没有正式的意义,我们仍然可以非正式地使用他们来指代原型链中位置或高或低的对象。


猜你喜欢
- 本文实例讲述了Python3.4列表、数组操作。分享给大家供大家参考,具体如下:python列表,数组类型要相同,python不需要指定数据
- 机器学习分两大类,有监督学习(supervised learning)和无监督学习(unsupervised learning)。有监督学习
- 在利用DL解决图像问题时,影响训练效率最大的有时候是GPU,有时候也可能是CPU和你的磁盘。很多设计不当的任务,在训练神经网络的时候,大部分
- 导语:哈喽,哈喽~小编不知道你有没有经历过,想联系一位很长时间没有联系的朋友,发现对方很早以前已经把你删除了,而你还一无所知。反正小编经历过
- 1、元旦之前受赵晨之邀作为讨论嘉宾参加了ACM组织的“人与信息社会巡讲”。2、去之前赵晨发给了我大致的讨论提纲。咣当了好几下~说实话,我是硬
- 本文实例为大家分享了Python实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下玩法:童年经典,普通模式没啥意思,小时候我们都是玩加速
- 聚合函数 count,max,min,avg,sum... select count (*) from T_Employee select
- 前文学习:python数据结构:数据类型.python数据结构输入输出及控制和异常.今天我们来学习面向对象编程,面向对象这种编程方式非常重要
- 本文实例讲述了JS+php后台实现文件上传功能。分享给大家供大家参考,具体如下:一、利用 FormData 对象形式上传FormData 是
- match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配, 也就是说match()只
- 鉴于安全性的需要,该对象收到很多限制,现在只剩下下列属性和方法。History历史对象有length这个属性,列出历史的项数。JavaScr
- 双指数函数待拟合曲线为 y(x) = bepx + ceqximport matplotlib.pyplot as pltx = ([0.0
- 负责为网页编程语言提供标准化服务的W3C组织(World Wide Web Consortium)近日开始修改超文本标记语言的定义,计划为该
- 本文实例讲述了Python复制文件操作用法。分享给大家供大家参考,具体如下:这里用python实现了一个小型的自动发版本的工具。这个“自动发
- 目录一、async二、await:三、综合应用一、asyncasync创建一个异步函数来定义一个代码块,在其中运行异步代码;怎样变成异步函数
- 面试题有一个test.xml文件,要求读取该文件中products节点的所有子节点的值以及子节点的属性值。test.xml文件:<!-
- 概述主要用于全国地区数据的操作,包括省,市,区 * 联动,地区数据的添加和删除; 在操作地区数据时,以前也用过树形的地区选择组件,但因其在再操
- 1.什么是ORMORM 全拼Object-Relation Mapping.中文意为 对象-关系映射.在MVC/MVT设
- hp中怎么让json_encode不自动转义斜杠“/”?下面本篇文章给大家介绍一下PHP中让json_encode不自动转义斜杠“/”的方法
- pyecharts产生背景Echarts是由百度开源的数据可视化,凭借良好的交互性和精巧的图表设计,得到众多开发者的认可,而python很适