[翻译]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 functionconstructor 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的对象也将获得新的属性。

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

猜你喜欢

  • superLink,让伪链接更有可用性

    2009-06-02 12:35:00
  • Oracle逗号分隔列转行实现方法

    2011-01-04 20:13:00
  • 如何提升JavaScript的运行速度(DOM篇)

    2010-05-17 13:32:00
  • HTML 标签是否匹配检测代码

    2010-03-17 20:50:00
  • 用户如何有效地利用ORACLE数据字典

    2008-03-04 18:19:00
  • VBScript中清除数组元素Erase语句

    2008-06-27 13:05:00
  • ASP.NET中使用SQL存储过程的方法

    2007-08-24 09:31:00
  • 关于点击区域

    2009-07-24 13:08:00
  • 如何增大MYSQL数据库连接数

    2010-10-25 20:28:00
  • asp操作Excel类源码

    2009-12-25 19:01:00
  • 典型的三行二列居中高度自适应css布局

    2008-02-22 16:02:00
  • 删除数据库中重复数据的两个方法

    2008-01-01 19:16:00
  • asp伪静态情况下实现的utf-8文件缓存实现代码

    2011-02-24 10:49:00
  • jQuery技巧

    2009-09-27 12:28:00
  • 通用分页存储过程

    2007-11-28 13:08:00
  • 网页设计十大诀窍

    2007-10-19 13:03:00
  • Opera Mini 5 网站开发速记

    2010-04-20 16:29:00
  • MySQL Proxy应用入门(1)--安装MySQL Proxy

    2011-03-08 09:50:00
  • asp如何判断一个电子信箱格式是否有效?

    2010-01-12 20:18:00
  • 使用IP地址来统计在线人数方法

    2007-08-13 12:51:00
  • asp之家 网络编程 m.aspxhome.com