[翻译]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中同样没有正式的意义,我们仍然可以非正式地使用他们来指代原型链中位置或高或低的对象。
猜你喜欢
- 如果我们知道一个静态文件的实际路径如:https://www.aspxhome.com/download/cidianwang.pdf,如果
- 今天开始学习 YUI,加强一下对 JavaScript 的理解。1. 命名空间 YAHOO
- asp中fso怎样判断一个盘上是否有文件,实例代码,需要的朋友可以试试:<% dim objfolder dim
- 二进制转字符串入口参数:字节流函数返回:字符串Code By:Madpolice利用 ADODB.Stream 对象,速度比原来
- <% '****************************** '函数:Chec
- 物质世界客观存在,而人的“视觉成像”是对当前世界的“唯心”重建。这种重建基于个人“经验”、“感知”和“集体意识”。最初科学家认为人类通过视觉
- 存储过程采用的是select top 加 not in的方式完成,速度也算是相当快了 我测试过了百万级数据量一般查询在1秒一下,贴出来大家交
- 阅读上一篇:FrontPage XP设计教程3——网页的布局 FrontPage XP可以保证用户设计网页与不同的浏览器兼容,它所提供的样式
- 1.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点;2.会用asp,并不说明你会asp;3.看a
- 当我们准备建立一个Web站点时,就必须向域名登记机构申请一个Internet域名,因此,我们通常希望了解自己准备使用的域名是否已经被注册,这
- 今天我要为大家介绍的是XPath,XPath是导航和查询XML文档的语言。我们从一个函数开始。UpdateXML()函数我们已经花了很多时间
- 当讨论Request对象内容时,要研究的集合之一就是ServerVariables集合。这个集合包含了两种值的结合体,一种是随同
- 我正在开发一个档案管理系统,需要从数据库中同时调出图像及相关的文字说明,可我只做到了单纯地显示图片,像有一个数据库CHUNFENG,在数据库
- 临近下班的时候,突然想到统计热门文章的问题。以前我所知道的热门文章统计,基本有这么几种:按点击数排序 该方法最大的问题在于热门的文章会越来越
- 创建与打开站点启动FrontPage XP,选择菜单“文件/新建”,再单击“网页或站点”命令选项。在“新建网页或站点”任务窗格
- web2.0的标志是Ajax的异步通信的发掘,给我们带来像google map,google suggest 这样令人惊叹的东西。而Ajax
- adodb.stream对象的方法/属性cancel 方法使用方法如下object.cancel说明:取消执行挂起的异步 execute 或
- select a.f_username from ( SELECT /*+parallel(gu,4)*/distinct gu.f_use
- 测试:IE6、IE7、FF3.014突发奇想的效果,主要突出构思,效果还比较粗糙,好好创意一下,应该可以引申出一些比较有新意的图片切换效果。
- [数据恢复故障描述]一台重要的MYSQL数据库服务器,146GB*2,RAID1,约130GB DATA卷,存储了大约200~300个数据库