资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,第,12,章,JavaScript,面向对象编程(,OOP,),面向对象编程(,Object Oriented Programming,,,OOP,)是一种计算机编程架构。,OOP,的一项基本原则就是计算机程序是由多个能起到子程序作用的单元或对象组合而成的。,OOP,达到了软件工程的三个重要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都可以接受信息、处理数据和向其他对象发送信息。,12.1 JavaScript,中的类,在,OOP,(面向对象编程)中,类定义一类对象,描述对象的属性(数据)和方法(行为)。具有相同或相似性质的对象的抽象,就是类。类的具体化就是对象,也可以说类的实例是对象。例如“张三”、“李四”都有名字,但是一个是“张三”,一个是“李四”。“张三”、“李四”两个人都可以行走,但各自的行走速度又不一样。本节将详细的向读者介绍在,JavaScript,中创建和使用类。,12.1.1,创建类,在,JavaScript,中的类使用“,function”,来声明。,function People(),12.1.2,类的属性,上面创建的,People,类,没有包含任何数据,显然这是不实用的。在一个对象中,相关的数据被封装在不同的属性中。类的属性就是对象属性的抽象。现在来给,People,类添加一个表示名字的,name,属性和一个表示性别的,sex,属性,如下所示。,function,People(name,sex,),this.name,=name;,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,公有方法和私有方法,属性有公有和私有之分,方法也有公有和私有之分,其概念与公有及私有属性类似。通过,this,指针添加的方法都是公有方法,公有方法可以被外部调用,例如,changeName,方法。私有方法则只能在对象内部被调用,其对外是不可见的,这里同样通过作用域来实现。,12.1.6,静态属性和静态方法,由于类的构造函数本身也是对象,直接将属性和方法添加到这个对象中,则可以达到静态属性和静态方法的效果,如下所示。,function People(),People.staticProperty,=“Static Property”;/,静态属性,People.staticMethod,=function();/,静态方法,12.1.7,原型对象,prototype,在,JavaScript,面向对象的能力中,还有一个重要的概念:原型对象(,prototype,)。每个对象,可以参考一个原型对象,原型对象包含自己的属性。原型对象就好像是一个对象定义的备份。当代码引用一个属性的时候,它并不存在于对象本身里,那么,JavaScript,会自动在原型的定义中查找这个属性。而且,一个对象的原型对象又可以参照另外一个原型对象,就这样以链式最终关联到基类对象的构造函数。这是,template,模型(模板方法,,设计模式,中行为模式中的一种),它可以简化方法的定义,同时也可以产生强大的继承机制。,12.2 JavaScript,中的继承,继承是面向对象程序设计语言不同于其他语言最重要的特点。所有继承,就是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础上进行,把这个已经存在的类的内容作为自己的内容,并加入若干新的内容。在软件开发中,类的继承使得所建立的软件具有开放性、扩充性,它简化了对象、类的创建工作,增加了代码的可重用性。,JavaScript,并没有对继承提供语法上的支持,但是仍然可以巧妙的实现继承的机制。下面向读者详细介绍,JavaScript,中的继承。,12.2.1,对象冒充,对象冒充,是指一个对象冒充另外一个对象来执行其他对象的方法,或者说是一个对象将另外一个对象的方法当作自己的方法来执行。,JavaScript,提供了,call,和,apply,两个方法来实现这种机制。,call,和,apply,方法所实现的功能是一样的,只是参数形式不同,其语法如下所示。,functionName.call(object,argument1,argument2,argument3,);,functionName.apply(object,argument1,argument2,);,12.2.2,使用对象冒充实现继承,使用对象冒充机制可以巧妙的实现继承机制,如下所示。,12.2.3,继承原型对象中的属性和方法,对象冒充实现了继承,但是仍然还有一些缺陷。在使用对象冒充机制来实现继承的时候,子类只是在构造函数中调用了父类的构造函数,但是没有对父类的原型对象作任何处理,这使得定义在父类原型对象中的属性和方法没有被继承。,12.2.4,封装继承方法,为了简化开发,现在将继承的方法进行封装,以方便使用,如下所示。,12.3,更多技巧,前面,2,节向读者介绍了在,JavaScript,中使用类和继承的方法,这节将向读者介绍更多,JavaScript,面向对象编程的技巧,包括属性的封装、多态、命名空间等等。,12.3.1,属性的封装,程序中,People,类的,name,属性以私有属性的形式存储在类中,而提供给外部的属性访问接口则是,getName,和,setName,方法。这种封装方法使得程序可以在属性存取的过程中增加一些逻辑处理,并且即使类内部的实现改变了,但提供给外部的接口不变,不会影响到其他的程序。,12.3.2,实现多态,多态是指给同名的方法提供不同的实现能力,它使得程序可以不用关心方法的具体实现而仅仅依靠其名称来进行调用操作。,12.3.3,命名空间,命名空间是一个层次模型,其作用是用来避免对象命名上的冲突,以及将不同功能的类分类放置以方便使用。,12.3.4,实现短类名,使用命名空间带来的好处是毫无疑问的,但是同样也带来了一个麻烦。那就是如果命名空间嵌套得太深,在使用时会很不方便,例如要用到某个命名空间下的类,如下所示。,var,serializer,=new,Sys.Web.Script.JavaScriptSerializer,();,12.4,使用,JSVM,进行代码组织,本节主要向读者介绍使用,JSVM,对,JavaScript,代码进行组织管理的基本方法,更多高级的特性读者可以访问,http:/,www.jsvm.org,进行了解。,12.4.1,下载和配置,JSVM,JSVM,可以在,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,文件夹平级。在示例程序中,页面被打开时没有加载任何类文件。页面上提供了一个按钮,当单击按钮时,程序会加载位于,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,来有效的对代码进行组织和管理。,
展开阅读全文