《第12章__JavaScript面向对象编程(OOP).ppt》由会员分享,可在线阅读,更多相关《第12章__JavaScript面向对象编程(OOP).ppt(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第12章 JavaScript面向对象编程(OOP)面向对象编程(Object Oriented Programming,OOP)是一种计算机编程架构。OOP的一项基本原则就是计算机程序是由多个能起到子程序作用的单元或对象组合而成的。OOP达到了软件工程的三个重要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都可以接受信息、处理数据和向其他对象发送信息。12.1 JavaScript中的类在OOP(面向对象编程)中,类定义一类对象,描述对象的属性(数据)和方法(行为)。具有相同或相似性质的对象的抽象,就是类。类的具体化就是对象,也可以说类的实例是对象。例如“张三”、“李四”都有名字,
2、但是一个是“张三”,一个是“李四”。“张三”、“李四”两个人都可以行走,但各自的行走速度又不一样。本节将详细的向读者介绍在JavaScript中创建和使用类。12.1.1 创建类在JavaScript中的类使用“function”来声明。function People()12.1.2 类的属性上面创建的People类,没有包含任何数据,显然这是不实用的。在一个对象中,相关的数据被封装在不同的属性中。类的属性就是对象属性的抽象。现在来给People类添加一个表示名字的name属性和一个表示性别的sex属性,如下所示。function People(name,sex)this.name=name;
3、this.sex=sex;12.1.3 类的方法一个对象还应具有一些操作,用于改变对象的状态,对象及其操作就是对象的行为。类的方法是对象行为的抽象。12.1.4 公有属性和私有属性在类中通过this指针添加的属性,都是公有(public)属性。公有属性指可以被外部访问的属性,如下所示。var someone=new People(“Susan”,”female”);var name=someone.name;/读取name属性someone.name=“Lily”;/写入name属性12.1.5 公有方法和私有方法属性有公有和私有之分,方法也有公有和私有之分,其概念与公有及私有属性类似。通过t
4、his指针添加的方法都是公有方法,公有方法可以被外部调用,例如changeName方法。私有方法则只能在对象内部被调用,其对外是不可见的,这里同样通过作用域来实现。12.1.6 静态属性和静态方法由于类的构造函数本身也是对象,直接将属性和方法添加到这个对象中,则可以达到静态属性和静态方法的效果,如下所示。function People()People.staticProperty=“Static Property”;/静态属性People.staticMethod=function();/静态方法12.1.7 原型对象prototype在JavaScript面向对象的能力中,还有一个重要的概念
5、:原型对象(prototype)。每个对象,可以参考一个原型对象,原型对象包含自己的属性。原型对象就好像是一个对象定义的备份。当代码引用一个属性的时候,它并不存在于对象本身里,那么JavaScript会自动在原型的定义中查找这个属性。而且,一个对象的原型对象又可以参照另外一个原型对象,就这样以链式最终关联到基类对象的构造函数。这是template模型(模板方法,设计模式中行为模式中的一种),它可以简化方法的定义,同时也可以产生强大的继承机制。12.2 JavaScript中的继承继承是面向对象程序设计语言不同于其他语言最重要的特点。所有继承,就是子类自动共享父类数据结构和方法的机制,这是类之间
6、的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础上进行,把这个已经存在的类的内容作为自己的内容,并加入若干新的内容。在软件开发中,类的继承使得所建立的软件具有开放性、扩充性,它简化了对象、类的创建工作,增加了代码的可重用性。JavaScript并没有对继承提供语法上的支持,但是仍然可以巧妙的实现继承的机制。下面向读者详细介绍JavaScript中的继承。12.2.1 对象冒充对象冒充,是指一个对象冒充另外一个对象来执行其他对象的方法,或者说是一个对象将另外一个对象的方法当作自己的方法来执行。JavaScript提供了call和apply两个方法来实现这种机制。call和app
7、ly方法所实现的功能是一样的,只是参数形式不同,其语法如下所示。functionName.call(object,argument1,argument2,argument3,);functionName.apply(object,argument1,argument2,);12.2.2 使用对象冒充实现继承使用对象冒充机制可以巧妙的实现继承机制,如下所示。12.2.3 继承原型对象中的属性和方法对象冒充实现了继承,但是仍然还有一些缺陷。在使用对象冒充机制来实现继承的时候,子类只是在构造函数中调用了父类的构造函数,但是没有对父类的原型对象作任何处理,这使得定义在父类原型对象中的属性和方法没有被继
8、承。12.2.4 封装继承方法为了简化开发,现在将继承的方法进行封装,以方便使用,如下所示。12.3 更多技巧前面2节向读者介绍了在JavaScript中使用类和继承的方法,这节将向读者介绍更多JavaScript面向对象编程的技巧,包括属性的封装、多态、命名空间等等。12.3.1 属性的封装程序中People类的name属性以私有属性的形式存储在类中,而提供给外部的属性访问接口则是getName和setName方法。这种封装方法使得程序可以在属性存取的过程中增加一些逻辑处理,并且即使类内部的实现改变了,但提供给外部的接口不变,不会影响到其他的程序。12.3.2 实现多态多态是指给同名的方法提
9、供不同的实现能力,它使得程序可以不用关心方法的具体实现而仅仅依靠其名称来进行调用操作。12.3.3 命名空间命名空间是一个层次模型,其作用是用来避免对象命名上的冲突,以及将不同功能的类分类放置以方便使用。12.3.4 实现短类名使用命名空间带来的好处是毫无疑问的,但是同样也带来了一个麻烦。那就是如果命名空间嵌套得太深,在使用时会很不方便,例如要用到某个命名空间下的类,如下所示。var serializer=new Sys.Web.Script.JavaScriptSerializer();12.4 使用JSVM进行代码组织本节主要向读者介绍使用JSVM对JavaScript代码进行组织管理的基
10、本方法,更多高级的特性读者可以访问http:/www.jsvm.org进行了解。12.4.1 下载和配置JSVMJSVM可以在http:/www.jsvm.org免费下载,当前版本为2.06。下载的是一个压缩包,解压后的文件中包含文档、示例和JSVM的核心程序。12.4.2 路径和文件名的约定打开jsvm2文件夹,如图所示。12.4.3 编写类查看HelloWorld.class.js的内容,可以知道如何编写一个JSVM的类。12.4.4 类的按需加载为了向读者演示如何使用JSVM来加载存放在classes文件夹中的类,这里编写了一个名为demo.html的示例程序,与jsvm2文件夹平级。在
11、示例程序中,页面被打开时没有加载任何类文件。页面上提供了一个按钮,当单击按钮时,程序会加载位于example包下的HelloWorld类,并取得该类的一个实例,最后输出一段消息。12.4.5 在类中引用其他类在实际应用当中,类与类之间往往会有依赖关系,某个类依赖于其他一个或者多个类实现的情况很常见。在类文件当中,如果当前的类需要依赖包中的类或者其他包中的类,同样可以使用$import函数来引入这些类的定义。例如现在需要一个People类,其有一个name属性,有一个sayHello方法,sayHello方法的实现依赖于example包中的HelloWorld类,People类本身位于entity包内。首先在classes文件夹内建立entity文件夹,然后在entity文件夹内建立People.class.js文件。12.5 小结本章向读者介绍了JavaScript面向对象编程的知识,包括类的创建、属性和方法、公有和私有成员的概念和实现、静态属性和静态方法以及类的原型对象,接着探讨了JavaScript中类的继承方式。然后向读者介绍了在JavaScript中实现属性的封装、多态、命名空间等等技巧。最后介绍了如何使用JSVM来有效的对代码进行组织和管理。
限制150内