拥抱原型面向对象编程.doc_第1页
拥抱原型面向对象编程.doc_第2页
拥抱原型面向对象编程.doc_第3页
拥抱原型面向对象编程.doc_第4页
拥抱原型面向对象编程.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaScript 是最低级的Web 编程接口,随处可见。随着Web 日益成为日常生活的一部分,JavaScript 也开始变得备受关注。JavaScript 是一个经常遭到误解的语言,被认为是一种玩具语言或者一种“不成熟的Java 语言”。JavaScript 最饱受非议的特性之一是它的原型对象系统。尽管不可否认JavaScript 是存在一些缺陷,但原型对象系统并不在其内。在本文中,我们将了解功能强大、简洁、典雅的JavaScript 原型的面向对象编程。对象的世界当您开始新的一天时(开车去上班,坐在办公桌前执行一个任务,吃一顿饭,逛逛公园),您通常可以掌控您的世界,或者与之交互,不必了解支配它的具体物理法则。您可以将每天面对的各种系统看作是一个单元,或者是一个对象。不必考虑它们的复杂性,只需关注您与它们之间的交互。历史Simula 是一种建模语言,通常被认为是第一个面向对象(Object-oriented, OO) 的语言,随后出现的此类语言包括Smalltalk、C+、Java 和C#。那时,大多数面向对象的语言是通过类来定义的。后来,Self编程语言(一个类似Smalltalk 的系统)开发人员创建了一种可替代的轻量级方法来定义这类对象,并将这种方法称为基于原型的面向对象编程或者原型对象编程。终于,使用一种基于原型的对象系统将JavaScript 开发了出来,JavaScript 的流行将基于原型的对象带入了主流。尽管许多开发人员对此很反感,不过仔细研究基于原型的系统,就会发现它的很多优点。面向对象的编程(Object-oriented, OO) 试图创建工作原理相似的软件系统,面向对象编程是一个功能强大的、广泛流行的、用于软件开发的建模工具。 面向对象编程之所以流行,是因为它反映了我们观察世界的方法:将世界看作是一个对象集合,可与其他对象进行交互,并且可以采用各种方式对其进行操作。面向对象编程的强大之处在于其两个核心原则:封装允许开发人员隐藏数据结构的内部工作原理,呈现可靠的编程接口,使用这些编程接口来创建模块化的、适应性强的软件。我们可以将信息封装视为信息隐藏。继承增强封装功能,允许对象继承其他对象的封装行为。我们可以将信息继承视为是信息共享。这些原则对于大多数开发人员来说是众所周知的,因为每个主流编程语言都支持面向对象编程(在很多情况下是强制执行的)。尽管所有面向对象语言都以这样或那样的形式支持这两个核心原则,但多年来至少形成了2 种定义对象的不同方法。在本文中,我们将了解原型对象编程和JavaScript 对象模式的优势。什么是Prototypo?类和原型的关系类提供对象的抽象定义,为整个类或对象集合定义了共享的数据结构和方法。每个对象都被定义为其类的一个实例。类还有根据其定义和(可选)用户参数来构造类对象的责任。一个典型的示例是Point类及其子类Point3D,用来分别定义二维点和三维点。清单1 显示了Java 代码中的类。清单1. JavaPoint类class Point private int x;private int y;static Point(int x, int y) this.x = x;this.y = y;int getX() return this.x;int getY() return this.y;void setX(int val) this.x = val;void setY(int val) this.y = val;Point p1 = new Point(0, 0);p1.getX() / = 0;p1.getY() / = 0;/ The Point3D class extends Point, inheriting its behaviorclass Point3D extends Point private int z;static Point3D(int x, int y, int z) this.x = x;this.y = y;this.z = z;int getZ() return Z;void setZ(int val) this.z = val;Point3D p2 = Point3D(0, 0, 0);p2.getX() / = 0p2.getY() / = 0p2.getZ() / = 0和通过类来定义对象相比,原型对象系统支持一个更为直接的对象创建方法。例如,在JavaScript 中,一个对象是一个简单的属性列表。每个对象包含另一个父类或原型的一个特别引用,对象从父类或原型中继承行为。您可以使用 JavaScript 模拟Point示例,如清单2 所示。清单2. JavaScriptPoint类var point = x : 0,y : 0;point.x / = 0point.y / = 0/ creates a new object with point as its prototype, inheriting points behaviorpoint3D = Object.create(point);point3D.z = 0;point3D.x / = 0point3D.y / = 0point3D.z / = 0传统对象系统和原型对象系统有本质的区别。传统对象被抽象地定义为概念组的一部分,从对象的其他类或组中继承一些特性。相反,原型对象被具体地定义为特定对象,从其他特定对象中继承行为。因此,基于类的面向对象语言具有双重特性,至少需要2 个基础结构:类和对象。由于这种双重性,随着基于类的软件的发展,复杂的类层次结构继承也将逐渐开发出来。通常无法预测出未来类需要使用的方法,因此,类层次结构需要不断重构,让更改变得更轻松。基于原型的语言会减少上述双重性需求,促进对象的直接创建和操作。如果没有通过类来束缚对象,则会创建更为松散的类系统,这有助于维护模块性并减少重构需求。直接定义对象的能力将会加强和简化对象的创建和操作。例如,在清单2 中,仅用一行代码即可声明您的point对象:var point = x: 0, y: 0 ;。仅使用这一行代码,就可以获得一个完整的工作对象,从JavaScriptOtotype(比如toString方法)继承行为。要扩展对象行为,只需使用point将另一个对象声明为其原型。相反,即使最简洁的传统面向对象语言,也必须先定义一个类,然后在获得可操作对象之前将其实例化。要继承有关行为,可能需要定义另一个类来扩展第一个类。原型模式理论上比较简单。作为人类,我们往往习惯于从原型方面思考问题。例如,Steve Yegge 在博客文章“The Universal Design Pattern”(请参阅参考资料)中讨论过,以橄榄球运动员Emmitt Smith 为例,谁拥有速度、敏捷性和剪力,谁就将成为美国国家橄榄球联盟(National Football League,NFL)所有新成员的榜样。当一个新跑步运动员LT 发挥超常捡到球时,评论员通常会这样说:“LT 有双Emmitt 的腿。”“他就像Emmitt 一样自由穿过终点线。”“他跑一英里只用5 分钟!”评论员以原型对象Emmitt Smith 为模型来评论新对象LT。在JavaScript 中,这类模型看起来如清单3 所示。清单3. JavaScript 模型var emmitt = / . properties go here;var lt = Object.create(emmitt);/ . add other properties directly to lt您可以将该示例与经典模型进行比较,在经典模型中您可能会定义一个继承自FootballPlayer类的RunningBack类。LT 和Emmitt 可能是RunningBack的实例。这些Java 代码编写的类看起来如清单4 所示。清单4. 3 个Java 类class FootballPlayer private string name;private string team;static void FootballPlayer() string getName() return ;string getTeam() return this.team;void setName(string val) = val;void setTeam(string val) this.team = val;class RunningBack extends FootballPlayer private bool offensiveTeam = true;bool isOffesiveTeam() return this.offensiveTeam;RunningBack emmitt = new RunningBack();Runn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论