建立接口的三种方式--鸭式辩型接口

  • 通常建立javascript接口有三种方式:
  • 1 注释描述接口
  • 2 属性检测接口
  • 3 鸭式辩型接口
  • 接口的利弊:
  • 对于一些中小型程序来说 使用接口很显然是不明智的,对项目来说接口的好处也不明显,只是徒增其复杂度而已。
  • 对于接口的好处,那么显而易见 首先促进代码的重用,对于开发来讲,还可以告诉程序员那些类都使用了什么方法,如果你事先知道接口那么就减少了你在编码的时候对类与类之间冲突,实现解耦。对于测试和调试也会变得轻松,用于javascript的弱类型语言,类型不匹配经常出现,那么使用接口,这一点会变得容易一些。
/*
      定义接口的方式:鸭式辩型,最完美的定义方式
      鸭式辩型核心:一个类实现接口的主要目的:把接口的方法都实现(对所有方法进行检测)
      完全对象对象,代码也实现统一,也解耦了
      */

      //一,接口类

      //name:接口的名字(String)
      //methods:接受方法名称的集合(数组形式)
      var Interface = function(name,methods){
        //判断接口参数个数
        if (arguments.length != 2) {
          throw new Error('参数不能小于2个');
        }
        this.name = name;

        //定义一个空数组对象,存放methods里的方法
        this.methods = [];
        for(var i=0, len = methods.length; i<len; i++){
          if(typeof methods[i] !== 'string'){
            throw new Error('不能是字符');
          }
          this.methods.push(methods[i]);
        }
      }

      //二,准备工作
      //实例化接口对象
      var CompositeInterface = new Interface('CompositeInterface',['add','remove']);
      var FormItemInterface = new Interface('FormItemInterface',['update','select']);

      //具体的实现类
      var CompositeImpl = function(){

      }

      CompositeImpl.prototype.add = function(){
        console.log('add.....');
      }

      CompositeImpl.prototype.remove = function(){
        //do something....
      }

      CompositeImpl.prototype.update = function(){
        //do something....
      }

      CompositeImpl.prototype.select = function(){
        //do something....
      }

      //三,校验接口里的方法
      //通过不做任何操作,不通过则抛出异常
      //这个方法的目的,就是检测方法的
      Interface.ensureImplements = function(object){
        //判断穿的参数不能小于2个
        if(arguments.length < 2){
          throw new Error('参数不能于2个');
        }

        //获得接口实例对象
        for(var i=1, len = arguments.length; i<len; i++){
          var instanceInterface = arguments[i];
          //判断参数是否是接口的类型
          if(instanceInterface.constructor !== Interface){
            console.log('参数必须是接口类型');
          }

          //循环接口实例对象里面的每一个方法
          for(var j=0; j<instanceInterface.methods.length; j++){
            //用一个临时变量,接受每一个方法的名字(注意是字符串)
            var methodsName = instanceInterface.methods[j];
            //Object[key]就是方法
            if(!object[methodsName] || typeof object[methodsName] !== 'function'){
              throw new Error("错误 '" +methodsName + "' 类型");
            }
          }
        }
      }

      var com = new CompositeImpl();
      Interface.ensureImplements(com,CompositeInterface,FormItemInterface);
      com.add();


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值