JavaScript 接口原理与用法实例详解


Posted in Javascript onMay 12, 2020

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

js接口

意义:

提供一种以说明一个对象应该有哪些方法的手段。
接口是面向对象javascript程序员的工具箱中最有用的工具之一

接口的利弊:

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

  • 对于接口的好处,那么显而易见 首先促进代码的重用,对于开发来讲,还可以告诉程序员那些类都使用了什么方法,如果你事先知道接口那么就减少了你在编码的时候对类与类之间冲突,实现解耦。对于测试和调试也会变得轻松,用于javascript的弱类型语言,类型不匹配经常出现,那么使用接口,这一点会变得容易一些。

注释接口描述

优点:程序员可以有一个参考
缺点:属于文档的范畴 ,这种方式过于松散, 没有检查接口的方法是否完全被实现

interface Composite{
    
 function add (obj) ;
 function remove (obj) ;
 function update ( obj ) ;

}
 
//CompositeImp1 implements Composite
var CompositeImp1 = function () {
 
}
CompositeImp1.prototype.remove = function ( obj ) {
 
}
CompositeImp1.prototype.update = function ( obj ) {
 
}
CompositeImp1.prototype.add = function (obj) {
 
}

var c1 = new CompositeImp1();

属性检测

判断接口是否存在

/*interface Composite{

 function add (obj) ;
 function remove (obj) ;
 function update ( obj ) ;

}

interface FormItem {
 
 function select (obj) ;
 
}
*/

//CompositeImp1 implements Composite , FormItem
var CompositeImpl = function () {
 //显式在类的内部, 接受所实现的接口
 //一般来说, 在类的内部,定义一个数组(数组变量名字固定)
 this.implementsInterfaces = ['Composite', 'FormItem']; //利用 implementsInterfaces 后续的判断使用
 
}

CompositeImpl.prototype.remove = function ( obj ) {
 // do something ...
}
CompositeImpl.prototype.update = function ( obj ) {
}
CompositeImpl.prototype.add = function (obj) {
 alert('add');
}
CompositeImpl.prototype.select = function (obj) {
}

//检测 CompositeImpl 类 的对象
function CheckCompositeImpl ( instance ) {//实例对象作为参数,检测是否存在
 
 //判断当前对象是否实现了所有的接口。
 if ( !IsImplements(instance,'Composite','FormItem') ) {
  throw new Error('Object does not implement a requried interface');
 }
 
}

//公用的具体的检测方法(核心方法) //return boolean
function IsImplements ( obj ) { //判断实例对象,有没有实现相关的接口.
 
 //arguments 对象 获得函数的实际参数
 for ( var i=1; i<arguments.length; i++ ) {
  
  //接收所实现接口的名字
  var interfaceName = arguments[i];
  
  //判断此方法, 是 成功,还是失败。 
  var interfaceFound = false;
  
  for ( var j=0; j<obj.implementsInterfaces.length; j++ ) {
   
   if ( obj.implementsInterfaces[j] == interfaceName ) {
    
    interfaceFound = true;
    
    break;
    
   }
   
  }
  
  if ( !interfaceFound ) {
   
   return false;
   
  }
  
 }
 
 return true;
 
}

鸭式辩型法

核心: 一个类实现接口的主要目的:把接口里的方法都实现。(检测实现方法)
完全面向对象,代码实现统一, 也解耦

//1 ,接口类。 //定义一个类,作为借口的基类,通过类实例化N多个接口实例。// Class Interface 

接口类所需要的2个参数
参数1:接口的名字 (string)
参数2:接收方法名称的集合 methods, 是一个数组 (array)
//实现抽象方法 
var Interface=function( name,methods ){ //methods 的名字必须是String类型的可以.
if( arguments.length != 2 ){
 throw new Error('the instance Interface constructor arguments must be 2 length!');
};
this.name=name;
this.methods=[]; //定义一个内置的空数组对象,等待接受methods里的元素 (方法名字);
for( var i=0; i<methods.length; ++i ){
 if( typeof methods[i] !== 'string' ){
  throw new Error('ths Interface method name is error');
 };
 this.methods.push( methods[i] );
};
};

//2 准备工作: 具体的实现类
//①实例化接口对象.
var CompositeInterface=new Interface('CompositeInteface',['add','remove']);
var FormIntemInterface=new Interface('FormIntemInterface',['update','select']);
//CompositeImpl implements CompositeInterface,FormIntemInterface.
//②具体的实现类
var CompositeImpl=function(){ }
//③实现接口的方法
//implements methods
CompositeImpl.prototype.add=function(){ alert('add'); }
CompositeImpl.prototype.remove=function(){ alert('remove'); }
CompositeImpl.prototype.update=function(){}
//   CompositeImpl.prototype.select=function(){}
//3: 检验接口里的方法.
//检验通过, 不做任何操作, 代码继续执行. 不通过,抛出异常, Error. //这个方法的目的,就是检测方法的 .
Interface.ensureImplements=function( obj ){ //核心检验方法.
if( arguments.length < 2 ){ //如果检测的方法接受的参数小于2个, 参数传递失败.
 throw new Error('Interface.ensureImplements 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];
  //object[key];
  if( !obj[methodName] || typeof obj[methodName] !== 'function' ){
   //对象没有这个方法.
   throw new Error('the method name "' + methodName + '" is not found!');
  };
 };
}
}
var c1=new CompositeImpl();
Interface.ensureImplements( c1,CompositeInterface,FormIntemInterface );
c1.add();

总结:接口是实现解耦。避免类和类之间,调用方法的冲突。

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

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

Javascript 相关文章推荐
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
Aug 08 Javascript
jQuery Animation实现CSS3动画示例介绍
Aug 14 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
Dec 29 Javascript
node.js文件上传处理示例
Oct 27 Javascript
微信小程序引用公共js里的方法的实例详解
Aug 17 Javascript
浅谈redux以及react-redux简单实现
Aug 28 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
Sep 26 Javascript
vue中el-upload上传图片到七牛的示例代码
Oct 19 Javascript
使用Vue 实现滑动验证码功能
Jun 27 Javascript
微信小程序如何实现五星评价功能
Oct 15 Javascript
Javascript 关于基本类型和引用类型的个人理解
Nov 01 Javascript
JavaScript严格模式不支持八进制的问题讲解
Nov 07 Javascript
ES5新增数组的实现方法
May 12 #Javascript
JavaScript内置对象之Array的使用小结
May 12 #Javascript
详解ES6新增字符串扩张方法includes()、startsWith()、endsWith()
May 12 #Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
May 12 #Javascript
详解ES6数组方法find()、findIndex()的总结
May 12 #Javascript
JQuery表单元素取值赋值方法总结
May 12 #jQuery
JavaScript或jQuery 获取option value值方法解析
May 12 #jQuery
You might like
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
分享3个php获取日历的函数
2015/09/25 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
点图片上一页下一页翻页效果
2008/07/09 Javascript
js constructor的实际作用分析
2011/11/15 Javascript
jQuery插件uploadify实现ajax效果的图片上传
2016/06/18 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
AngularJS基础 ng-src 指令简单示例
2016/08/03 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
深入理解React高阶组件
2017/09/28 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
[49:59]KG vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python封装对象实现时间效果
2020/04/23 Python
python文件读写并使用mysql批量插入示例分享(python操作mysql)
2014/02/17 Python
python实现同时给多个变量赋值的方法
2015/04/30 Python
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
Python使用PIL模块生成随机验证码
2017/11/21 Python
python实现redis三种cas事务操作
2017/12/19 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
python gdal安装与简单使用
2019/08/01 Python
Python线程指南分享
2019/11/19 Python
Python底层封装实现方法详解
2020/01/22 Python
检测浏览器对HTML5和CSS3支持度的方法
2015/06/25 HTML / CSS
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
2016/03/22 HTML / CSS
ECHT官方网站:男女健身服
2020/02/14 全球购物
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
中软Java笔试题
2012/11/11 面试题
公司司机岗位职责
2014/02/07 职场文书
物流业务员岗位职责
2014/02/08 职场文书
后勤部经理岗位职责
2014/02/23 职场文书
毕业论文致谢词
2015/05/14 职场文书
科级干部培训心得体会
2016/01/06 职场文书
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis