用Javascript实现interface的类似功能

由于javascript是弱类型的语言,

参数不能限定类型,

所以提供一个方法isInstence(obj)来判断此对象是否是实现这个接口的类型.

注意,在实现这个接口之后并不会把这个接口加入到Function 的原形链中.

(此功能支持同时实现多个接口)
<script language="javascript">
Function.prototype.exChain=new Array();
Function.prototype.implements=function(itf)
{
 
     var innerObj=new this();
     for(i in itf.abstruct)
     {
      if(itf.abstruct[i].constructor==Function)
      {
       if(!innerObj[i])
       {
        throw new Error(9001,"请实现接口中的所有抽象函数。")
       }
      }
     }
     this.exChain.push(itf.constructor);
     this.exChain.push(this);
     innerObj=null;
     return this;
}
var Abstruct=function(){}
Function.prototype.isInstence=function(obj)
{
     for (var i=0;i<obj.constructor.exChain.length;i++)
     {
      if(this==obj.constructor.exChain[i])
      {
       return true;
      }
     }
     if(this==obj.constructor)
     {
      return true;
     }
     return false;
}

/////////////////////////////////////////////////////
InterfaceA=function()
{
     this.abstruct=new Abstruct();
     this.abstruct.show=function(){}
     //this.abstruct.getMsg=function(){}
}

InterfaceB=function()
{
     this.abstruct=new Abstruct();
     this.abstruct.showB=new Function();
}

var ClassA=function()
{
     this.show=function()
     {
      alert("ClassA");
     }
     this.showB=function()
     {
      alert("ClassA.showB")
     }
 
}.implements(new InterfaceA()).implements(new InterfaceB())

var o1=new ClassA();
o1.show();
o1.showB();
alert(InterfaceA.isInstence(o1));
alert(InterfaceB.isInstence(o1));
alert(ClassA.isInstence(o1));

 

var ClassB = function()
{
 
}
alert(ClassB.isInstence(o1));

</script>

posted @ 2007-05-22 20:06  过河卒A  阅读(999)  评论(2编辑  收藏  举报