zoukankan      html  css  js  c++  java
  • 鸭式辨型

    鸭式辨型来自于James Whitecomb Riley的名言:"像鸭子一样走路并且嘎嘎叫的就叫鸭子。"通过制定规则来判定对象是否实现这个接口。

    创建接口类,主要用来保存信息到实例类中

    var Interface = function (name, methods) {
        this.name = name;
        this.method = methods;
    }

     自定义接口,接口中定义了接口名称和一些方法名称。这里创建一个Duck接口,Duck接口中定义了swim, cry, foots方法。说得简单些,接口就是自定义规则。我定义了会游泳,会嘎嘎叫,有两条腿的就是鸭子。

    var Duck = new Interface('Duck', ['swim', 'cry', 'foots'])

    创建检测方法。它用来检测对象中有没有实现Duck接口中所有的方法,如果有就认为这个对象实现了Duck接口;否则就认为没有实现。

    Interface.ensureImplements = function (obj, interface) {
        var canNotFoundMethods = [];    
        for(var i = 0, len = interface.method.length; i < len; i++) {
            //检测对象有没有接口中所有方法
            if(!interface.method[i] || typeof obj[interface.method[i]] !== 'function') {
                canNotFoundMethods.push(interface.method[i]);
            }
        }
        if(canNotFoundMethods.length){
             throw new Error(obj.name+'实例对象没有实现'+interface.name+'接口');
        }else{
            console.log(obj.name+'实例对象已经实现'+interface.name+'接口');
        }
    }

    创建被检测的对象_new_duck。这个对象继承了三个方法。

    var duck = function (){ this.name = 'duck'; }
    duck.prototype = {    
        'swim': function (){},
        'cry': function (){},
        'foots': function (){},
    }
    var _new_duck = new duck();

    最后检测,如果_new_duck中有Duck接口定义的所有方法,那么我们就可以认为_new_duck对象实现了Duck接口。我们前面定义了鸭子是会游泳,会嘎嘎叫,还有两条腿,所有符合这规则定义的就可以称为鸭子。正如_new_duck拥有了Duck接口所有定义的方法。

    Interface.ensureImplements(_new_duck, Duck); 

    总结:

      鸭式辨型理解起来并不困难。实现接口实际上是检测对象是否拥有接口定义的所有方法。接口只是用来定义某些方法名称,它并不需要实现这些方法,比如Duck接口中不需要实现swim方法。接口要做的是记住方法名称。

    Duck.swim();   //Duck接口并不需要实现swim方法
  • 相关阅读:
    react组件之间传值方式
    html url 传递锚点并添加参数
    Spring Boot 构建WAR包
    Spring Boot Actuator 的使用
    Spring boot的启动加载原理
    intellij idea resin容器部署web工程
    Mybatis Mapper之见解
    踩坑----数据库阻塞
    redis缓存与数据库的记录不一致造成的问题.(乐观锁)
    H5中popstate事件的诡异行为
  • 原文地址:https://www.cnblogs.com/Songyc/p/4267844.html
Copyright © 2011-2022 走看看