“对象”这个词的英文原文是object,其实翻译成“实体”、“东西”可能更贴切一些。
翻译成“对象”,编程序就是搞对象,小朋友的家长可能会有意见。而成年的单身程序员
每当程序写错时,经常看到“找不到对象”的报错信息,也不会高兴起来。
通俗的说,对象就是,把数据和动作行为捆在一起,这两样东西叫做对象的“成员”,分
“成员数据”和“成员函数”。成员数据也叫“属性”,本身可以是另一个或另一些对象
。成员函数又叫“方法”,英文“Method”,其实和普通的函数基本一样,我也不知道为
什么又叫“方法”。
下面看一个例子,对象的定义和使用。
var JYprice = 6; //酱油6元一瓶
function child(){ //定义一种对象类型:小朋友
this.money = 0; //小朋友一开始都没钱
this.DaJiangYou = function(jiping){ //小朋友会打酱油,要打几瓶打几瓶
if(this.money >= jiping * JYprice){ //this 代表当前的这个小朋
友对象
this.money -= jiping * JYprice;
alert("买"+ jiping +"瓶酱油");
return "妈,我把酱油买回来啦";
}else{
return "妈,钱不够";
}
}
}
LittleNiu = new child(); //有一个小朋友叫小牛
LittleNiu.money += 10; //给小牛10块钱
alert(LittleNiu.DaJiangYou(1)); //让小牛打瓶酱油,看看结果怎样
在这个例子中,先定义一个“类”,名叫child(小朋友),然后产生一个child类的对象,
叫LittleNiu(小牛),然后对这个对象进行操作,给他钱,让他打酱油,显示打酱油的
返回结果。
child()这个函数不是一般的函数,而是一个类的定义,学名叫构造函数。里面定义了
child类的对象都有哪些成员,本例中只有一个成员数据和一个成员函数。
“点儿”(.)操作符前面是对象,后面是成员,例如LittleNiu.money。如果引用的数据成
员是另一个对象,还可以继续“点儿”下去。
“this”代表当前所属的对象。
“new”操作符用来产生一个指定类的新对象。
那个JYprice,只是一个普通的变量,和面向对象的语法无关,只是为了避免当酱油涨价
的时候,改起来麻烦。
如果不用面向对象的方法,函数“打酱油”的两次调用之间不能保存数据,无法知道上次
还剩多少钱,只能在函数的上级程序块声明一个变量保存。这样代码凌乱,管理不便,不
如本例中用一个对象表示来的简洁和直观。
面向对象的编程,就是把世界万物看成对象,它们的相互从属和相互操作构成了这个缤纷
的世界。当然,程序所描述的是对现实世界的抽象,但是和从前的面向过程的编程方法相
比,面向对象更接近真实世界。
面向对象的开发方法,经历了一个从无到有的过程,你的父母当年学的,可能就只有面向
过程的开发。面向对象的语法,一般会牺牲运行速度,并占用更多的内存,还有其他的麻
烦。和变量不同,对象的作用域不受程序块限制,当一个对象用完之后,需要进行垃圾处
理。C++是要求程序员给每一个类写一个析构函数,在对象用完的时候调用以便把自己清
理干净;后来java发明了垃圾处理机,终于不用担心析构函数出问题造成内存泄漏了,但
运行效率也大大降低。Javascript是怎么处理垃圾的,我也不知道,反正不用程序员操心
了。好在现在的计算机性能今非昔比,虽然javascript的运行效率和java相比也是惨不忍
睹,但只要不是要求很高的场合都够用了,算一个数用0.0000001秒还是0.0001秒,没太
大关系。据说一些大银行的程序还是用面向过程的方法开发的,因为开发年代早,在那个
年代,连年份都要省去“19”,后来还因此产生了“千年虫”问题。现在也不敢随便改,
因为面向过程的代码改起来风险较大。总之,面向对象这种“奢侈”的编程方法只有在计
算机性能大大提高之后才成为可能。
和java相比,java重视“类”, 而javascript更重视“对象”。
Java必须先有定义完善的“类”,然后才能生成“类”的“实例”也就是“对象”。Java
的“类”语法中引入了封装性、多态性、继承性等特性,适合于管理大的工程项目。其实
java主要的开发工作就是写各种“类”(Class),不但“累”,有时还会“泪”。
而javascript的语法非常随意,没有“类”也可以生成对象,已经生成的对象可以随时增
加成员。从这里可以看到javascript对程序员体贴入微的一面,也体现了面向对象的编程
方法给软件开发带来的巨大方便。在本教程之前发表的“挖地雷”的例子中,就大量使用
了面向对象的方法,使整个代码不到50行,除了一个两层循环之外没有复杂的流程控制结
构,简洁直观,体现了软件工程“低表示差异”的原则。
必须强调,面向对象是一种思想,而不是仅仅一种语法。
据说javascript产生对象有4种方法,和孔乙己先生“回”字有4种写法有一拼。我建议使
用前面例子的方法,因为这种方法比较接近java,另外学一种也够用了,其他的可以慢慢
了解。
对象可以作为函数的参数传递,在函数体里参数是对象,调用时传进去也必须是对象。
可以随时给变量添加新的成员,语法也很简单,例如增加“年龄”这一数据成员,只要:
LittleNiu.age = 12;
可以不要类而直接生成一个什么都没有的对象,然后再添加成员:
LittleNiu = new Object();
LittleNiu.money=0;
LittleNiu.DaJiangYou = function(jiping){
if(this.money >= jiping * JYprice){
this.money -= jiping * JYprice;
alert("买"+ jiping +"瓶酱油");
return "妈,我把酱油买回来啦";
}else{
return "妈,钱不够";
}
}
在javascript内部,实际上是把变量也是当作对象处理的,具有对象的一些特性。例如,
字符串型变量有一个数据成员,名叫length,是这个字符串的长度:
Var aaa = "一二三四五上山打老虎”;
alert(aaa.length);
还有成员函数叫substr,可以返回指定的子字符串:
Var aaa = "一二三四五上山打老虎";
alert(aaa.substr(2,4));
返回的是从第3个字符开始的4个字符。为什么不是substr(3,4),是因为javascript数数
从0开始,这个在本系列教程开篇时提到过。
本来javascriot提供的alert() 函数只能显示字符串,为什么也能显示数字型和布尔型变
量,就是因为它们内部都藏有一个toString()方法,返回一个字符串,供alert显示。而
对象一般没有toString方法,因为不知道应该显示什么,所以alert一个对象时,就会显
示“Object”,不信可以试试:
aaa = new Object();
alert(aaa);
如果你给对象写一个toString()方法,alert的时候就会显示你指定的内容:
LittleNiu.toString = function(){return "我叫小牛";}
还有一大批“天然”的对象,我们要经常打交道的,那就是html页面元素。例如
<input type="text" >
注意,这不是javascript的代码,是html的内容。
这是一个最普通的输入框,目前它有一个数据成员叫value,也就是这个输入框当前的内
容。这个成员是“天然”存在的,不需要你去定义。还有一些方法名是给你“天然”预留
的,与某些“事件”关联。例如onClick()与鼠标点击这一“事件”,关联,你可以给这
个输入框添加onClick()成员函数:
<input type="text" onClick="alert(this.value);">
你可以在输入框里写点内容,然后点击输入框,就会弹出消息显示当前内容。
这部分内容的语法比较没有章法,怎么写的都有,本例中不加引号不加分号也能正常运行
。
除了onClick,还有onBlue(焦点离开),onChange(改变内容)等等。
Html元素中,还可以随心所欲添加自己的成员,完全和对象一样。例如:
<input type="text" changetimes=0 onChange="
this.changetimes++;
if(this.changetimes>3){
alert('你改来改去的到底有把握没有啊');
}
">
不断修改输入内容,每次改完把鼠标点击一下别处,到第四次时就会弹出“你改来改去的
到底有把握没有啊”的消息。
运用面向对象方法,要尽量让程序设计贴近真实世界,也就是“低表示差异”的原则,这
样的比较程序简洁、直观、易懂、易修改,不易出错。
练习题:
上一节课的练习题是程序设计大赛,现在把它改成面向对象。要求每个选手向赛
会提供一份构造函数,赛会用两名选手的构造函数生成两名选手对象,进行对战。赛会可
以规定裁判与选手之间的接口,也就是选手对象的两个成员函数:出牌和接收本轮比赛结
果,的函数名称,供裁判调用。
--
FROM 114.251.89.*