DHTML基础教学(8)--程序基本概念之面向对象篇
DHTML基础教学(8)--程序基本概念之面向对象篇
面向对象的领域很广,不是在一篇中三言两语就能说完的,本篇主要说明的是在 JavaScript 中会用到的观念
面向对象主要是要将现实生活中的对象(物品)观念带入程序语言中
例如冷气机是一个对象,它有颜色,有造型,有送风、吹冷气、除湿等功能,若我们不是制造冷气机的人,那我们不需要知道它是如何送风、吹冷气、以及除湿,我们只要知道怎么用它即可,冷气机自己不会知道现在要送风还是要除湿,而是要等人们去开了送风的开关时,它才会送风
上面一段话就有表达出一个对象所具备有的东西
对象的颜色、造型…等等,即是对象的特征,在程序语言中称之为属性(Property),例如上述的冷气机可看作它有两个属性,一个是颜色,一个是造型
对象的功能,例如上述的送风、吹冷气、除湿等功能,在程序语言中称之为方法(Method),也就是这个对象能做些什么事情
而上述中,当开了送风的开关后,冷气机就开始送风,这种‘当做了什么动作后,会发生什么事情’,就是程序语言中所谓的事件(Event)
因此,上述的概念运用到程序语言中,程序就不再只是一行一行的源程序,而是已经被对象化了
另外,程序中的对象感觉起来可以比现实生活中的对象更加的广泛,在现实生活中所称的对象,一般是指我们看得见的东西,例如锅碗瓢盆,而像声音、时间等等这种不可见的,一般我们不会说它是个对象,但是在程序里的面向对象中,任何东西都可以看成是对象,也就是在程序中会包含了‘可见对象’与‘不可见对象’两种
接着我们以程序语言的角度来看看面向对象
在数据型态篇中有提到了程序语言中的一些常用的型态,也提到了在面向对象中可以自定义型态
数据型态可以看作是存放数据的规格,当我们将数据存放到电脑中时,实际上只是写入了一些 0 与 1 的内容而已,那么在这么一大堆 0 与 1 的数据中,电脑如何知道哪些中合在一起看作一份数据的?主要就是运用这个数据型态
字符串有字符串的规格,数字有数字的规格,因此,只要我们能提供一个可用的规格给电脑,那就相当于是我们自定义了一个型态了,在面向对象中即是通过建立类别(Class)来自定义型态,在型态中,我们可以定义这个型态具备有哪些属性及方法
型态并不是我们的数据,它只是规格而已,例如‘字符串’是型态,是规格,而 "abc" 这才是我们的数据
类别型态的数据,通常称之为实体(instance),一般来说都需要用类别的构造函数(constructor)才能产生这个类别的 instance
不同的程序语言,其用以调用 Constructor 来产生 instance 的语法会有不同,我拿 JavaScript 中的 Date 型态来当例子,我们要产生一个 Date 的实体,语法如下
在第 1 行中的 Date() 就是 Date 型态的 Constructor,而 new 是 JavaScript 中用以调用 Constructor 来产生 instance 的一个关键字,所以 d 代表的就是一个 Date 型态的 instance,即是我们的数据,要记得,就算 d 代表的是 Date 对象,但 d 仍然是个变量,只不过是个 Date 型态的变量而已
再者,上面有提到了对象可能会有属性、方法、及事件,这些东西通常称之为对象的成员(members),每种程序语言对于存取属性或调用方法等的语法不尽相同,但也大同小异,例如 JavaScript 的语法如下
对象变量名.成员名
也就是若要存取对象的属性时,则为
对象变量名.属性名
例如假设 MyClass 这个型态有个 name 属性,则存取语法为
var o = new MyClass();
o.name = "abc";
var s = o.name;
对象的属性(Property),其实跟变量非常类似,只不过我们必须通过对象才能存取到它而已,在上例中,第 2 行是在给 name 属性一个值,而第 3 行则是读取 name 的属性值
再看一个实际的 JavaScript 例子
第 1 行及第 2 行分别声明了 s 及 length 这两个变量,故第 3 行及第 4 行 alert 的信息分别为 "abc" 及 1,而 s 是一个字符串对象,它有个 length 属性,值为该字符串的长度(即字符数),故第 5 行 alert 的信息会是 3,s 的 length 属性与第 2 行中声明的 length 变量完全没有关系,所以值也不会互相覆盖
调用 Method 的语法也差不多,语法如下
对象变量名.方法名()
对象变量名.方法名(参数)
在 JavaScript 中,调用 Method 时,必须在 Method 名之后加上括号
对象的方法(Method)与函数(Function)也非常类似,同样是调用它时,会执行内含在 Method 或 Function 中的一段源程序,只不过我们必须通过对象才能调用它而已
有些 Method 或 Function 会定义必须传入一些值给它处理,这些值即叫做参数(Argument),传入参数的语法就是将参数值写在括号内
有些 Method 或 Function 则会定义执行它后,它会返回一个值,一般称为返回值(return value),例如返回 Method 内的程序处理后的结果
假设 MyClass 这个型态有个 setName 及 getName 方法,则调用的语法为
var o = new MyClass();
o.setName("abc");
var s = o.getName();
第 2 行是调用 setName 这个 Method,并将 "abc" 这个字符串传进去给它处理,而第 3 行是在调用 getName 这个 Method ,并取得它的返回值
再看一个实际的 JavaScript 例子
第 1~3 行是 JavaScript 中用来声明函数的语法,这里单纯的只是返回 "some thing" 这个字符串,第 5 行即是在调用它,并且让 s1 这个变量接收函数所返回的值,故第 7 行 alert 的信息会是 "some thing"
另外,第 4 行声明了一个 d 变量,而 Date 对象有个 toLocaleString 的方法,会返回这个日期对象所代表的日期字符串,所以第 8 行 alert 的信息就会是一个日期(及时间),同样的,d 的 toLocaleString 方法与第 1~3 行中声明的 toLocaleString 函数完全没有关系,所以也不会有冲突
再者,除非我们是定义(开发)类别型态的人,又或者我们有它的原始程序,否则一般来设我们不会知道 Method 内实际上做了哪些事,只知道使用它后会有什么结果,这其实是个好处,我们使用的人通常并不会也不需要去知道它内部的运作,只须要知道如何用它,以及使用它后能获得什么效果,就好像我们知道如何使用电话,也知道可用电话跟远处的人通话,但很少人会去关心电话的原理,所以有一些公司或组织就会开发一些好用的类别给大家用,而我们也只要会用就好
而事件(Event)通常是可与用户互动(可被操作)的可见对象才会有的,也就是当用户对这个对象做了什么事时,才会触发相对应的事件,但这不是绝对的
Event 其实跟 Method 很像,同样是调用它时,会执行内含在 Event 中的一段源程序,差别在于 Method 是我们写程序去调用的,而事件则是在某个状况时会自动被执行的,这里所谓自动被执行,是对于我们在使用这个对象的人而言的,幕后当然它也是由某些源程序去调用的,只是因为这些动作不是我们写的,我们看不到这些动作,故感觉上就是在某个状况时会自动被执行。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
