网络编程
位置:首页>> 网络编程>> JavaScript>> [翻译]JavaScript中对象的层次与继承

[翻译]JavaScript中对象的层次与继承

作者:chenzhe 来源:chenzhe 发布时间:2008-12-31 13:36:00 

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

版权所有: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的对象也将获得新的属性。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com