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 相关文章推荐
Firebug 字幕文件JSON地址获取代码
Oct 28 Javascript
基于jquery的jqDnR拖拽溢出的修改
Feb 12 Javascript
jquery js 获取时间差、时间格式具体代码
Jun 05 Javascript
HTML,CSS,JavaScript速查表推荐
Dec 02 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
Feb 22 Javascript
Jquery轮播效果实现过程解析
Mar 30 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
May 16 Javascript
JavaScrpt判断一个数是否是质数的实例代码
Jun 11 Javascript
详解vue-cli 脚手架 安装
Apr 16 Javascript
浅谈对于react-thunk中间件的简单理解
May 01 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
May 08 Javascript
JavaScript的一些小技巧分享
Jan 06 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
PHP经典的给图片加水印程序
2006/12/06 PHP
五个PHP程序员工具
2008/05/26 PHP
用php实现百度网盘图片直链的代码分享
2012/11/01 PHP
浅析php中抽象类和接口的概念以及区别
2013/06/27 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
php实现简单加入购物车功能
2017/03/07 PHP
用javascript实现页面打印的三种方法
2007/03/05 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
js实现具有高亮显示效果的多级菜单代码
2015/09/01 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
基于JavaScript实现智能右键菜单
2016/03/02 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
Vue动态实现评分效果
2017/05/24 Javascript
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
2020/09/10 Javascript
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
对python的unittest架构公共参数token提取方法详解
2018/12/17 Python
python try except返回异常的信息字符串代码实例
2019/08/15 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
2020/02/28 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
Pretty Little Thing爱尔兰:时尚女性服饰
2017/03/27 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
中专毕业自我鉴定
2013/10/16 职场文书
航空大学应届生求职信
2013/11/10 职场文书
法学院方阵解说词
2014/01/29 职场文书
放飞梦想演讲稿800字
2014/08/26 职场文书
80后婚前协议书范本
2014/10/24 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
java实现对Hadoop的操作
2021/07/01 Java/Android
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers