JavaScript接口实现方法实例分析


Posted in Javascript onMay 16, 2020

本文实例讲述了JavaScript接口实现方法。分享给大家供大家参考,具体如下:

JavaScript中实现接口的方法有三种:

第一种,使用注释的方法实现接口

特点:

(1)最简单,但是功能最弱

(2)利用 interface和 implement"文字"

(3)把他们用注释的方式表现出来

具体实现如下:

1,用注释定义一个接口

/*
  * interface PersonDao(){
  * function add(obj);
  * function remove(obj);
  * function find(id);
  * }
  * */

(2)用注释来注明实现的接口

/*
  * PersonDaoImp implement PersonDao (PersonDaoImp实现接口PersonDao) 
  * */
  var PersonDaoImp=function () {  };//定义实现类
   //实现
  PersonDaoImp.prototype.add=function(obj){
    //具体代码
  }
  PersonDaoImp.prototype.remove=function(obj){
    //具体代码
  }
  PersonDaoImp.prototype.find=function(id){
    //具体代码
  }

总结:

(1)使用文字的形式告知是谁实现谁

(2)优点,这样是很有意义的,大型项目需要的就是规范和标准,可以在没有写实现之前充分考虑架构和设计

(3)缺点:需要人为的遵守注释中的说明

第二种,使用属性检验法实现接口 。 实质为通过一个属性判断实现了谁

具体如下:

1,用注释来定义一个接口

/*
   * interface PersonDao(){
   * function add(obj);
   * function remove(obj);
   * function find(id);
   * }
   * */

2,用注释来说明实现接口类+实现类中增加属性

/*
   * PersonDaoImp implement PersonDao
   * */
  var PersonDaoImp=function () {
    this.implementInterface=["PersonDao"];//告知该类实现的接口是啥是一个数组,
}
  PersonDaoImp.prototype.add=function(obj){
       alert(obj);
  }
  PersonDaoImp.prototype.remove=function(obj){
    //具体实现
  }
  PersonDaoImp.prototype.find=function(id){
    //具体实现
  }

(3)检验属性的方法

//接收一个不定参数 可能有多个 使用Object
    function imp1(Object) {
    //遍历传入对象的所用属性 i=1:第一个是不定参数,从第二个参数开始遍历接口,故i=1
      for(var i=1;i<arguments.length;i++){//arguments除Object外
        var interfaceName=arguments[i];
        var interfaceFind=false;
        for(var j=0;j<Object.implementInterface.length;j++){
           if(Object.implementInterface[j]==interfaceName){
             interfaceFind=true;
             break;
           }
        }
        if(!interfaceFind){
          return false;
        }
      }
      return true;
    }

(4)接口与实现类的配合实现

function addObj(obj) {
    var PersonDao=new PersonDaoImp();
    //开始检查 实现类是否实现接口
      if(!imp1(PersonDao,"PersonDao")){//某对象是否实现接口(对象,接口)  第一次参数是对象,第二个参数是不定参数
        throw new Error("PersonDaoImp没有实现接口PersonDao");
      }else{//实现
        PersonDao.add(obj);
      }
  }

(5)使用

addObj("实现");

 总结一下,该种方式只是简单判断了在实现时有没有传递与属性中相同的接口名称,而对于方法是否实现没有做验证。

 于是有了第三种的鸭式变形法--检验接口中的方法是否实现。

第三种,鸭式变形法 一种形似的命名方式,从实现角度来理解为:如果对象中具有的方法与接口中定义的方法同名 则认为是实现了本接口

具体如下:

1,定义一个接口类 注意这里与上面两种不一样了,不用写注释说明了

var Interface=function (name,methods) {//name:接口名字
    if(arguments.length<2){
      alert("必须是两个参数")
    }
    this.name=name;
    this.methods=[];//定义一个空数组装载函数名
    for(var i=0;i<methods.length;i++){
      if(typeof methods[i]!="string"){
        alert("函数名必须是字符串类型");
      }else {
        this.methods.push( methods[i]);
      }
    }
  }

2,定义一个静态方法来实现接口与实现类的 直接检验

注意,静态方法不要写成Interface.prototype ,因为这是写到接口的原型链上的,我们要把静态的函数直接写到类层次上。

Interface.ensureImplement=function (object) {
   if(arguments.length<2){
     throw new Error("参数必须不少于2个")
     return false;
   }
   for(var i=1;i<arguments.length;i++){
     var inter=arguments[i];
     //如果是接口就必须是Interface类型
     if(inter.constructor!=Interface){
        throw new Error("如果是接口类的话,就必须是Interface类型");
     }
      //判断接口中的方法是否全部实现
      //遍历函数集合
     for(var j=0;j<inter.methods.length;j++){
      var method=inter.methods[j];//接口中所有函数

       //object[method]是传入的函数
       if(!object[method]||typeof object[method]!="function" ){//实现类中必须有方法名字与接口中所用方法名相同
           throw new Error("实现类中没有完全实现接口中的所有方法")
            }
          }
   }
 }

3,应用

3.1定义自己的接口    

         例如:此处定义两个接口

var FirstInterface=new Interface("FirstInterface",["add","remove","search"]);//第一个接口
 var SecondInterface=new Interface("SecondInterface",["save"]);//第二个接口

3.2,定义实现类

function commManager() {//实现两个类
    //先实现方法
    this.add=function () {
      alert("ok--实现");
    }
    this.remove=function () {
    }
    this.search=function () {
    }
    this.save=function () {
    }
    //检验
    Interface.ensureImplement(this,GridManager,formManager);
  }

3.3,实现类的实例化

var comm=new commManager();
  comm.add();//调用

 总结:三种方式都有自己的优势与缺点,每种的选择需要根据自己的需要进行选择。但是在设计的时候实现类间低耦合的相当重要的。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
csdn 批量接受好友邀请
Feb 19 Javascript
面向对象的Javascript之三(封装和信息隐藏)
Jan 27 Javascript
ParseInt函数参数设置介绍
Jan 02 Javascript
js与applet相互调用的方法
Jun 22 Javascript
AngularJS基础 ng-mousemove 指令简单示例
Aug 02 Javascript
jquery对象和DOM对象的相互转换详解
Oct 18 Javascript
Bootstrap缩略图与警告框学习使用
Feb 08 Javascript
详解关于vue-area-linkage走过的坑
Jun 27 Javascript
Vue插槽原理与用法详解
Mar 05 Javascript
Vue动态组件和异步组件原理详解
May 06 Javascript
原生js 实现表单验证功能
Feb 08 Javascript
vue使用localStorage持久性存储实现评论列表
Apr 14 Vue.js
JavaScript 类的封装操作示例详解
May 16 #Javascript
jquery+css3实现的经典弹出层效果示例
May 16 #jQuery
js抽奖转盘实现方法分析
May 16 #Javascript
JSONP 的原理、理解 与 实例分析
May 16 #Javascript
JavaScript随机数的组合问题案例分析
May 16 #Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
May 18 #Javascript
vue el-tree 默认展开第一个节点的实现代码
May 15 #Javascript
You might like
PHP 加密/解密函数 dencrypt(动态密文,带压缩功能,支持中文)
2009/01/30 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
javascript获取隐藏元素(display:none)的高度和宽度的方法
2014/06/06 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
AngularJS模块学习之Anchor Scroll
2016/01/19 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
js装饰设计模式学习心得
2018/02/17 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
vue实现点击关注后及时更新列表功能
2018/06/26 Javascript
mpvue+vant app搭建微信小程序的方法步骤
2019/02/11 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
Python的字典和列表的使用中一些需要注意的地方
2015/04/24 Python
利用Python爬取微博数据生成词云图片实例代码
2017/08/31 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
Python:Numpy 求平均向量的实例
2019/06/29 Python
python实现的自动发送消息功能详解
2019/08/15 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
2020/02/26 Python
Pycharm 2020.1 版配置优化的详细教程
2020/08/07 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
纯CSS3实现移动端展开和收起效果的示例代码
2020/04/26 HTML / CSS
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
荷叶圆圆教学反思
2014/02/01 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
出国签证在职证明范本
2014/11/24 职场文书
小学老师对学生的评语
2014/12/29 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
商标侵权律师函
2015/05/27 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书