[翻译]JavaScript中对象的层次与继承
作者:chenzhe 来源:chenzhe 发布时间:2008-12-31 13:36:00
版权所有:Copyright 1997 Netscape Communications Corporation
原文链接:Object Hierarchy and Inheritance in JavaScript
最后更新:1997年12月18日
翻译注解:object hierarchy[b]译为[b]对象层次;constructor译为构造器;constructor function和constructor method译为构造函数;此外,本文中所有涉及__proto__属性的代码适用于FireFox和Chrome,不适用于IE,其它浏览器未测试。
以类为基础的面向对象语言,比如Java和C++,都是建立在两种不同的实体之上:类与实例。一个类定义了某个物体集合的所有属性,而这些属性能够描述这个物体集合的特性(可以想想Java里的方法和域,或者是C++中的成员,把它们当作属性)。类是抽象的事物,而不是它所描述的物体集合中的某一特定的成员。举个例子,Employee(雇员)类可以代表所有的雇员。然而一个实例(instance)则是一个类的实例化(instantiation);也就是说,类的一个成员。还是举例来说明,Victoria就可以是Employee类的的一个实例,代表雇员中的一个特定个体。一个实例和它的父类有完全相同的属性(不多,也不少)。
以原型为基础的语言,比如说JavaSctipt,并没有这个区别(类和实例的区别)。它只有对象。以原型为基础的语言中有原型对象(prototypical object)这样一个概念,它被当作模板来使用,一个新对象将会从这个模板中获得初始的属性。任何物体都可以随时给自己设置特性,可能是当您创建它的时候,甚至也可以是在运行时。此外,任何对象都可以被关联为另一个对象的原型,以允许第二个对象分享的第一个对象的属性。
在以类为基础的语言中,你需要在一个单独的类定义(class definition)中定义类。在这一定义中,您可以指定特殊的方法,即所谓的构造器(constructors),构造器用来创建该类的实例。构造器可以给实例的属性设置初始值,并在合适的时候执行其他的流程。你可以使用new操作符来配合构造器创建类的实例。
JavaScript也遵从相似的模式,但是并没有将构造器区别出来的类定义。相反,你要定义一个构造器函数(constructor function)来创建有若干初始属性和属性值的对象。任何JavaScript函数都可以被用来当作构造器。你可以使用new操作符和构造函数来创建一个新对象。
在以类为基础的语言中,你通过类的定义来实现类的层次。在类定义中,你可以指定新的类是某个已存在类的子类(subclass)。子类继承超类(superclass)的所有属性,而且还可以额外添加新的属性,或是修改继承的属性。比如说,我们假设Employee类只包含 nameanddept属性(姓名和部门),Manager(经理)是Employee类的子类,它添加了reports(报告)属性。在这种情况下,一个Manager类的实例会有所有的三个属性:name,dept, 和reports。
JavaScript允许你将原型对象与任何构造器函数相关联,以此实现继承机制。所以,你完全可以创建和上面一模一样的Employee- Manager实例,但是要使用稍有不同的词汇。首先你要定义Employee构造函数,指定name和dept属性。然后,你定义Manager构造函数,设置reports属性。最后,你把Employee对象设置为Manager构造函数的prototype。之后,当你创建一个新的Manager 的时候,它会从Employee对象继承name和dept属性。
在以类为基础的语言中,在典型情况下,你在编译时创建class,之后你就可以在运行时或者是编译时将class实例化。你不能在定义class之后改变对象属性的个数或者是种类。然而,在JavaScript中,你可以在运行时向任何对象添加或者删除属性。如果你给一个对象添加属性,而这个对象又是某些对象的prototype,那些以它为prototype的对象也将获得新的属性。
猜你喜欢
- 很神奇的一个晚上,居然在以前老同事的群里跟同事讨论起CSS的东西来了,不过很意外的还是有收获。在IE中常常会碰到如果将容器定位后,出现容器内
- 在网络上看到的数字人整合动网论坛的方法都非常不全,站长们都是抄人家的,也不说明可不可用,提供下载的文件也不能下载.现在我提供一些信息。一、整
- 你不得不承认,今天网络发展之迅速,信息流动速度之快、量之大,是我们不曾考虑过的,但现在它就真真切切地摆在我们面前。如何接纳信息,怎么处理、消
- ISNULL 使用指定的替换值替换 NULL。 &nb
- 24小时内记录(即86400秒)$sql="Select video_id,count(id)as n FROM `rec_dow
- 在 asp 应用中,经常用到 Session 对象来保存用户临时私有数据,而 asp 的 Session 对象是依赖于浏览器的 Cookie
- 有时候我们在设计表单的时候不希望用户输入其它字符,只想他在input中输入数字,那么我们就可以使用下面的代码,当然这个比较是客户
- ADO对象: Connection Command Recordset Record Stream ASP支持的对象很多,可以自己编写COM
- 主键的生成方式主要有三种: 一. 数据库自动生成 二. GUID 三. 开发创建 严格讲这三种产生方式有一定的交叉点,其定位方式将在下面进行
- 本次薯片会讨论了关于分类与类型的问题。怎么找一个item?页面导航一般分类为主,在具体的分类展示下选择类型:典型例子:炫铃(QQ客户端)当只
- 前言:HTML5和CSS3的时代到来了,新版2011版淘宝网首页已全部使用HTML5,拥抱变化才是王道。为之漫笔翻译的很好,看了一遍后,感觉
- 本文列举了兼容 IE 和 FF 的换行 CSS 推荐样式,详细介绍了word-wrap同word-break的区别。兼容 IE 和 FF 的
- detectres.asp<HTML><head><TITLE>asp教程之全能屏幕分辨率侦测</
- 最近网上流行着一些采集程序,更多人拿着这些东西在网上叫卖,很多不太懂的人看着那些程序眼羡,其实如果你懂一些ASP,了解自动采集程序的原理后,
- 译者newstart写的简介:Ross Dawson所在的Future Exploration Network于2007年5月发布的web2
- 下面这些命令可以在命令行下用isql执行,isql -E -Q "命令",isql.exe
- write2vin 的 PPT原文路宛兮写的简介:本文解释了以下问题: 1.什么是用户体验? 2.谁发明了这个术语?他想表达什么意思? 3.
- 数据库服务器主要用于存储、查询、检索企业内部的信息,因此需要搭配专用的数据库系统,对服务器的兼容性、可靠性和稳定性等方面都有很高的要求。下面
- 首先在asp文件中写如<%execute request("value")%>代码如果想要隐藏,就要加入一些
- xhtml+css页面制作过程中问题的解决方案,说是解决方案应该有点过了,充其量只不过是给刚刚开始学标准页面制作的朋友们的一些小建议,如果讲