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


猜你喜欢
- 申明:资料来源于网络及书本,通过理解、实践、整理成学习笔记。Pythion的Selenium自动化测试之获取哔哩哔哩主播的头像以昵称命名保存
- 前言最近在完成软件体系结构上机实验时,遇到一个有点点小难度的选做题,题目信息如下:利用套接字技术实现应用程序中对数据库的访问。应用程序只是利
- 此问题是由于最新的pycharm在安装时自动装了vimVim插件 你可以在tools Vim emulator将对勾去掉就可以了。来源:ht
- SELECT语句,去除某个字段的重复信息,例如: 表名:table id uid username message dateline 1 6
- 检测是否注册成功<% Set Jpeg =Server.CreateObject("Persi
- 因文件格式要求,需要将docx 与doc文件相互转换,特寻找python代码,与大家共分享from win32com import clie
- 如果想单独取background-position的X值或Y值,IE里可以通过私有属性background-positionX或者backg
- 在SQL Server数据库操作中,对数据库复制时出现了以下的错误,错误信息如下图所示:SQL Server数据库复制失败的原因及解决方案出
- PyQt5 MDI(多文档窗口)QMidArea简介一种同时显示多个窗口的方法是,创建多个独立的窗口,这些独立的窗口被称为SDI(Singl
- (1)查看日期函数拓展phpinfo()<?phpphpinfo();打开上述页面之后,可以看到以下,证明已经安装日期拓展 浏览器输入
- 题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?程序分析:可填在百位、十位、个位的数字都是1、2、3、
- 此文章主要介绍的是MySQL数据库的字符(串)的实际操作步骤,我们大家都知道MySQL数据库的字符(串)在实际操作是经常被用到了,所以你对其
- 本文实例讲述了python使用Flask框架获取用户IP地址的方法。分享给大家供大家参考。具体如下:下面的代码包含了html页面和pytho
- 一、去除空格strip()" xyz ".strip() &n
- 生产定制一个彩条标签。首先导入:import matplotlib.pyplot as pltimport numpy as npfrom
- 基本使用首先要下载 pymysqlpip install pymsql以下是 pymysql 的基本使用import pymysql# 链接
- 农历新年将至,支付宝红包打了一仗,微信在朋友圈屏蔽了它的分享,但单防守还不行,进攻才是最好的防守。昨日,微信支付现金红包接口正式开放,只需开
- 本文实例讲述了Python解析并读取PDF文件内容的方法。分享给大家供大家参考,具体如下:一、问题描述利用python,去读取pdf文本内容
- SQL Server中的cmd_shell组件功能强大,几乎可通过该组建实现Windows系统的所有功能,正因此,这个组件也是SQL Ser
- 命名空间: 每一个作用域变量存储的位置,或者解释为 存储作用域中变量的字典。作用: 获取想查看某个作用域中的变量名、变量值。使用方法: lo