Javascript和PHP中对调用对象的类型控制

在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);
	}
  }
}

发表回复