隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别 — 百度百科
我们知道,在严格的面向对象的语言如java, c++中,对对象的封装是比较容易的。那么在javascript和php中,怎么去封装一个对象,并且隐藏对象的属性和细节呢?先看在PHP中怎么实现,由于PHP中提供了class关键字,我们可以用来定义一个类:
<?php class Workers{ public $age; public $name; public $sex; private $wage=5000; public function __construct($a,$b,$c){ $this->age=$a; $this->name=$b; $this->sex=$c; } public function saypay(){ echo $this->wage; } } ?>
在这里我们定义了一个“上班族”的类,这个类有四个属性,年龄,姓名,性别和工资,一般来说,前三个属性是公共可访问的,工资这个属性应当属于保密的范畴,不能所有能都访问到,所以,当我实例化一个对象小明的时候:
<?php $xiaoming=new Workers(25,"小明","男"); echo $xiaoming->age; //这里可以访问到小明的年龄 //当我要访问小明的工资的时候 echo $xiaoming->wage; //这里提示不能访问 ?>
这样的话,我们很好的保护了对象的内部属性。但是出现一个问题就是,小明的工资这个属性,不能所有人都不能访问。例如,小明每个月都需要像女朋友汇报每个月工资多少,然后上交,所以说,一些特定的情况下,小明把工资是多少说出来,Workers类中,有个saypay()的方法,可以调用小明的内部属性:
<?php echo $xiaoming->saypay(); //这里能显示5000 ?>
在这里,saypay函数是一个接口,用来调用对象内部受保护的属性;那么,在Javascript中,如何实现封装呢?由于Javascript并没有“类”这个概念,它的封装实现和理解起来就稍微有点困难,来看下面这个例子,同样是“上班族”这个类:
<script> function Workers(a,b,c){ this.age=a; this.name=b; this.sex=c; var wage=5000; this.saypay=function(){ return wage; } } var xiaoming=new Workers(25,"小明","男"); alert(xiaoming.age);//这里能够访问 alert(xiaoming.name);//这里能够访问 alert(xiaoming.sex);//这里能够访问 alert(xiaoming.wage);//这里不能访问,弹出未定义 //当我调用小明的saypay方法的时候: alert(xiaoming.saypay()); //能够访问小明的工资 </script>
在JS的列子中,也写出了类似PHP的类,当时它们的原理确实不一样的,PHP中,通过private来保护对象内部的私有属性不被访问或改写,Javascript中,是通过var声明一个内部变量,从来保证不被外部访问改写。两个例子中,我们都定义一个“接口”,用来访问对象被保护的属性。实际上,对象被保护的属性有些情况下也需要更改,例如小明的工资是5000,那么随着他工龄和技术水平的增长,工资就可能出现变化,这时候,我们也可以定义一个工资改变的方法,用来改变他的工资。