PHP封装和Javascript封装的比较

隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别 — 百度百科
我们知道,在严格的面向对象的语言如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,那么随着他工龄和技术水平的增长,工资就可能出现变化,这时候,我们也可以定义一个工资改变的方法,用来改变他的工资。

发表回复