在PHP中,有这样三个类,妻子,丈夫和银行,妻子和丈夫各有三个属性,分别为:性别,拥有多少钱,和各自一个不同的方法。妻子的方法是每个月把丈夫挣到的钱收起来,丈夫呢,则是每个月把钱上交给妻子。剩下的一个银行类,有两个属性,一个是拥有的资产数量,另外一个是方法,把钱上交给央行,在php中,我们可以这样定义这三个类:
class Wife{ public $sex="female"; public $money=10000; public function savemoney($people){ $this->money+=$people->handed(1000); } } class Husband{ public $sex="male"; public $money=10000; public function handed($num){ $this->money-=$num; return $num; } } class Bank{ public $money=100000000; public function handed($num){ $this->money-=$num; return $num; } }
我们知道,丈夫的钱上交给妻子,这是理所当然的,但是,这上面的例子中,我们会发现一个问题:银行的钱,也能上交给妻子!
$she=new Wife(); $he=new Husband(); $ccb=new Bank(); $she->savemoney($he); echo $she->money,"<br/>"; //妻子的钱变多了 echo $he->money; //丈夫的钱变少了 //接下来看看妻子能不能接受银行的上交 $she->savemoney($ccb); echo $she->money; //妻子的钱又变多了 echo $ccb->money; //银行的钱变少了
这样的程序里,妻子俨然成了抢劫犯,显然是不合理的。那么,我们如何阻止这种情况的发生呢?实际上,PHP提供给了我们类型的控制,我们在妻子类型的savemoney方法中,对调用对象的类型作出控制即可:
class Wife{ public $sex="female"; public $money=10000; public function savemoney(Husband $people){ $this->money+=$people->handed(1000); } }
这样,当我再次用妻子调用银行的方法时,讲会出现这样的错误提示:Argument 1 passed to Wife::savemoney() must be an instance of Husband, instance of Bank given。这样就很好的解决了类型问题。
那么在Javascript中,如果作出这样的控制呢?下面是没有作出控制之前的代码,妻子一样可以接收银行的上缴:
function Wife(){ this.sex="female"; this.money=10000; this.savemoney=function(peolpe){ this.money+=peolpe.handed(1000); } } function Husband(){ this.money=10000; this.sex="male"; this.handed=function(mun){ this.money-=mun; return mun; } } function Bank(){ this.money=100000000; this.handed=function(mun){ this.money-=mun; return mun } } var she=new Wife(); var he=new Husband(); var ccb=new Bank(); she.savemoney(he); console.log(she.money); console.log(he.money); she.savemoney(ccb); console.log(she.money); console.log(ccb.money);
但是在Javascript中并没有像PHP那样能够直接控制参数的类型,那么这时候我们要怎么样才能做到控制妻子不能接收银行的上缴呢?实际上,我们只需要判断妻子调用的这个对象是不是属于丈夫类就行了,javascript正好提供instaceof这个方法判断一个对象是否属于一个类:
function Wife(){ this.sex="female"; this.money=10000; this.savemoney=function(peolpe,Husband){ if(!(peolpe instanceof Husband)){ throw "Type error: objname must be an instance of Husband"; return false; }else{ this.money+=peolpe.handed(1000); } } }