zoukankan      html  css  js  c++  java
  • js接口

    1.接口

        -接口是面向对象javaScript程序员工具箱中最有用的工具之一,那么对于javaScript没有定义接口的概念,

    我们通过模拟高级程序语言的方式来创建javaScript中的接口。

      -接口的概念:提供一种以说明一个对象应该有哪些方法的手段。

      -通常建立javaScript接口的三种方式:

        -1.注释描述接口

        

    <script type="text/javascript" charset="utf-8">
                // javaScript中,定义接口有三种方式
                // 1.注解描述(特点,1.程序员可以有一个参考,2缺点是还是属于文档范畴,3如果程序员忘记了定义方法,不会出错。)
                // 缺点,方式太过松散,并没有检查接口方式是否被完全实现。
                /**
                 * interface Composite {
                 *     
                 *      function add();
                 *         function remove();
                 *         function update();
                 * }
                 */
                // CompositImpl implements Composite
                var CompositImpl = function () {
                    
                };
                
                // 用原型对象做,直接写在类里,会多次创建方法。
                CompositeImpl.prototype.add = function(obj) {
                    // do something
                };
                
                CompositeImpl.prototype.remove = function(obj) {
                    // do something
                };
                
                CompositeImpl.prototype.update = function(obj) {
                    // do something
                };
    
                
            </script>

        -2.属性检测接口

    <script type="text/javascript" charset="utf-8">
                // 2.属性检测
                /**
                 * interface Composite {
                 *     
                 *      function add();
                 *         function remove();
                 *         function update();
                 * }
                 * 
                 * interface FormItem {
                 *         function select(obj);
                 * }
                 */
                
                // CompositImpl implements Coposite 和 FormItem
                var CompositImpl = function (){
                    // 显示的在类的内部接受所实现的接口
                    // 一般来讲  在类的内部定义一个变量,名字要固定。这是一个规范
                    this.implemtnsInterface = ['Comosite','FormItem'];
                    
                };
                
                CompositeImpl.prototype.add = function(obj) {
                    // do something
                    alert('add');
                };
                
                CompositeImpl.prototype.remove = function(obj) {
                    // do something
                    alert('remove');
                };
                
                CompositeImpl.prototype.update = function(obj) {
                    // do something
                    alert('update');
                };
                
                CompositeImpl.prototype.select = function(obj) {
                    // do something
                    alert('select');
                };
                
                // 定义一个方法去检测 类是否实现了所有的接口
                function checkCompositImpl() {
                    // 判断当前对象是否实现了所有接口
                    if(!IsImplments(instance, 'Composite', 'FormItem')) {
                        throw new Error('Object does not implement a required interface');
                    }
                }
                
                // 判断当前对象是否实现了所有接口
                // 这个方法的主要目的就是判断 实例对象有没有实现相关的接口
                function IsImplments(Object) {
                    //arguments 获得实际参数
                    for (var i = 1; i < arguments.length; i++) {
                        // 接受所实现的每一个接口的名字
                        var interfaceNmae = arguments[i];
                        
                        var interfaceFound = false;
                        
                        for (var g = 0; g < Object.implemtnsInterface.length; g++) {
                            if (Object.implemtnsInterface[g] == interfaceName) {
                                interfaceFound = true;
                                break;
                            }
                        }
                        
                        if (!iterfaceName) {
                            return false;
                        }
                    }
                    return true;
                }
    
            </script>

        -3.鸭式辨型接口

    <script type="text/javascript" charset="utf-8">
                // 3.鸭式辨型(最完美的实现接口的方式)
                // 核心:一个类实现接口的主要目的就是将接口中的方法全部实现。(检测方法)
                // 优点:完全面向对象,代码也实现统一,也实现了解耦
                
                
                // 1.接口类  Class Interface  ==> 实例化N多个接口
                
                /*
                 * 接口类需要两个参数
                 * 1.接口的名字
                 * 2.接受方法名称的数组
                 */
                var Interface = function(name, methods) {
                    // 1.判断接口的参数个数
                    if(arguments.length != 2) {
                        throw new Error('this instance interface constructor must be 2 length');
                    }
                    this.name = name;
                    // 定义一个内置空数组,等待接受methods里面的元素
                    this.methods = [];
                    for (var i = 0, len = methods.length; i < len; i++) {
                        if(typeof methods[i] !== 'string') {
                            throw new Error('the interface method name is error!');
                        }
                        this.methods.push(methods[i]);
                    }
                };
                
                
                // 2.准备工作:具体的实现类
                // 实例化接口对象
                var CompositeInterFace = new Interface('CompositeInterFace', ['add', 'remove']);
                var FormItemInterFace = new Interface('FormItemInterFace', 'update', 'select');
                
                // CompositImpl 实现了CompositeInterFace和FormItemInterFace
                var CompositImpl = function() {
                    
                };
                
                CompositeImpl.prototype.add = function(obj) {
                    // do something
                    alert('add');
                };
                
                CompositeImpl.prototype.remove = function(obj) {
                    // do something
                    alert('remove');
                };
                
                CompositeImpl.prototype.update = function(obj) {
                    // do something
                    alert('update');
                };
                
                CompositeImpl.prototype.select = function(obj) {
                    // do something
                    alert('select');
                };
                 
                // 3.检验接口里的方法
                // 如果检验通过,不做任何处理。如果没有通过,则浏览器抛出异常
                // 这个方法的目的就是检测方法的
                Interface.ensureImplments = function(Object) {
                    if(arguments.length < 2) {
                        throw new Error('Interface.ensureImplments method constructor arguments must be >= 2');
                    }
                    
                    // 获得接口实例对象
                    for (var i = 1; i < arguments.length; i++) {
                        var instanceInterface = arguments[i];
                        // 判断参数是否是接口类的类型
                        if (instanceInterface.constructor !== interface) {
                            throw new Error('the arguments constructor not be Interface class!');
                        }
                        // 循环接口实例对象中的每一个方法
                        for (var j = 0; j < instanceInterface.methods.length; j++) {
                            // 用一个临时变量接受每一个方法的名字(字符串)
                            var methodName = instanceInterface.methods[j];
                            if(!Object[methodName] || typeof Object[methodName] != 'function') {
                                throw new Error('the method is not found');
                            }
                        }
                    }
                };
                
                var c1 = new ComopsitImpl();
                
                Interface.ensureImplments(c1, CompositeInterFace, FormItemInterFace);
            </script>
            

      -接口的利弊:

        -对于一些中小程序来说,使用接口显然是不明智的,对于项目来说接口的好处不明显,只是徒增复杂度。

        -对于接口的好处,首先增进了代码的重用,对于开发来讲,还可以告诉程序员哪些类都使用了哪些方法,

    如果你事先知道接口,那么就减少了你在编码的时候对类与类之间冲突,实现解耦。对于测试和调试也变得轻松。

    对于javaScript的弱类型语言,类型不匹配很常见,使用接口会变得容易一些。

      

  • 相关阅读:
    20172318 2017-2018-2 《程序设计与数据结构》第5周学习总结
    20172318 2017-2018-2 《程序设计与数据结构》第4周学习总结
    20172318 2017-2018-2 《程序设计与数据结构》实验1报告
    20172318 《程序设计与数据结构》第三周学习总结
    20172318 2017-2018-2 《程序设计与数据结构》第2周学习总结
    20172318 2016-2017-2 《Java程序设计》第一周学习总结
    寒假作业03
    寒假作业02
    20172311 2017-2018-2 《程序设计与数据结构》第五周学习总结
    20172311 《程序设计与数据结构》第四周学习总结
  • 原文地址:https://www.cnblogs.com/yangfanasp/p/7106362.html
Copyright © 2011-2022 走看看