js模拟java接口检测函数;确保子类实现接口中的方法:(出自js设计模式)
上代码:
<script type="text/javascript" >
/**
name:接口名称;字符串类型
arr_method:接口中的方法名称;数组形式[‘method1‘,‘method2‘,····]
可以定义接口名称和接口定义的方法名称,
**/
var Interface = function(name,arr_method){
if(arguments.length!=2){
throw new Error("参数不匹配,该接口要求两个参数,实际接口个数为"+arguments.length+"!");
}
this.name = name;
this.methods = [];
for(var i=0,len=arr_method.length;i<len;i++){
if(typeof arr_method[i]!=="string"){
throw new Error("传入的函数名称应当为string类型的!");
}
this.methods.push(arr_method[i]);
}
}
//检测对象是否实现接口中的所有方法(参数必须大于两个,第一个为待检测对象,其他的为要实现接口(是Interface类的实例);本函数检测该传 入对象是否实现这些接口的所有方法)
Interface.enSureImplements = function(o){
if(arguments.length<2){
throw new Error("函数参数不匹配!必须包含待检测对象和至少一个接口 ");
}
for(var i=1,len=arguments.length-1;i<len;i++){
var inter = arguments[i];
if(inter.constructor!==‘Interface‘){
throw new Error(i+"需要两个或者两个以上的实现Interface类的实例");
}
for(var j=0,jlen=inter.methods.length;j<jlen;j++){
var meth = inter.methods[j];
if(!o[meth]&& typeof o[method] !==‘function‘){
throw new Error("该对象没有实现接口:"+inter.name+" 的 "+meth+" 方法! ");
}
}
}
}
//检测这个实例是否实现对应的方法,并执行inteStance中的方法
function interTest(inteStance){
var play = new Interface("play",["go","pause","stop"]);
Interface.enSureImplements(inteStance,play);//检测这个类是否实现了接口play中的方法,然后执行inteState中 的方法
inteStance.go();
inteStance.pause();
inteStance.stop();
}
</script>