/*
接口:提供一种说明一个对象应该有哪些方法的手段
js中有三种方式实现接口:
1 注释描述接口
2 属性检测接口
3 鸭式辨型接口
*/ /*
1 注释描述接口: 不推荐
优点: 利用注解,给出参考
缺点:纯文档约束,是一个假接口,
程序不能检查实现接口对象是否实现所有接口方法
*/ /**
* interface Composite{
* function a();
* function b();
* }
*/
// CompositeImpl implements Composite
var CompositeImpl = function(){
//业务逻辑
};
CompositeImpl.prototype.a = function(){
//业务逻辑
};
CompositeImpl.prototype.b = function(){
//业务逻辑
}; /*
2 属性检测接口:
优点:能够检测实现哪些接口
缺点:没有完全脱离文档,
不能检测是否实现每个接口里的所有方法
*/
/**
* interface Composite{
* function a();
* }
*
* interface FormItem(){
* function b();
* }
*/
// CompositeImpl implements Composite,FormItem
var interfacesImpl = function(){
//在实现类内部用一个数组保存要实现的方法名
//通常这个属性名是团队中规定好的
this.implementsInterfaces = ["Composite","FormItem"];
};
CompositeImpl.prototype.a = function(){
//业务逻辑
};
CompositeImpl.prototype.b = function(){
//业务逻辑
}; //专门为这个实现对象写一个检测函数,传入实例对象,用于检查实力对象是否实现了所有接口
function checkImplements(obj){
//调用检查方法 obj是否实现两个接口,如果没有都实现则抛出异常
if(!isImplements(obj,"Composite","FormItem")){
throw new Error("接口没有全部实现!");
}
//接收一个参数obj是要检查的对象
function isImplements(obj){
//arguments对象能够获取实际传入函数的所有参数的数组
//传入的第0个参数是要检查的对象,所以从1开始检查
for(var i = 1; i < arguments.length ; i++){
//接收接口中每个接口的名字
var interfaceName = arguments[i];
//一个标记,是否实现这个接口,默认没有
var foundFlag = false;
//循环查询传入实例对象的实现接口数组 以检查是否全部实现
for(var j = 0 ;j <obj.implementsInterfaces.length;j++){
//如果 实现了这个接口 就修改标记跳出循环
if(obj.implementsInterfaces[j]==interfaceName){
foundFlag = true;
break;
}
}
//如果遍历实现接口数组之后没找到 就返回false
if(!foundFlag){
return false;
}
}
//如果都找到了 返回true
return true;
}
} //使用实力对象并检测
var o = new interfacesImpl();
checkImplements(o); //不会抛出异常 因为正确实现了两个接口
//如果在写interfacesImpl内的implementsInterfaces列表的时候少写了,那么就会在检查函数中抛出异常 /*
3 鸭式辨型法:(目前开发中使用的方式)
实现思想: */ //1 接口类 Class Interface
/**
* 接口类需要的参数:
* 1 接口的名字
* 2 要实现方法名称的数组
*/
var Interface = function( name , methods ){
//判断参数个数
if(arguments.length!=2){
throw new Error("接口构造器参数必须是两个!");
}
this.name = name;
this.methods = [];
for(var i = 0;i<methods.length;i++){
if( typeof methods[i] !== "string" ){
throw new Error("接口实现的函数名称必须是字符串!");
}
this.methods.push(methods[i]);
} };
//2 准备工作:
// 2.1 实例化接口对象 传入接口名 和 要实现的方法数组
var CompositeInterface = new Interface("CompositeInterface",["add","remove"]);
var FormItemInterface = new Interface("FormItemInterface",["update","select"]); // 2.2 实现接口的类
//CompositeImpl implementes CompositeInterface ,FormItemInterface
var CompositeImpl = function(){ };
// 2.3 实现接口的方法
CompositeImpl.prototype.add = function(obj){
alert("add...");
};
CompositeImpl.prototype.remove = function(obj){
alert("remove...");
};
CompositeImpl.prototype.select = function(obj){
alert("select...");
};
//在这里少实现一个方法 下面检测是否全部实现了接口方法
// CompositeImpl.prototype.update = function(obj){
// alert("update...");
// };
// 实例化 实现接口的对象
var c = new CompositeImpl(); //3 检验接口里的方法是否全部实现
// 如果检验通过 继续执行;如果不通过抛出异常;
Interface.ensureImplements = function(obj){
// 如果接收到参数小于2 说明 传参出错了,只传入一个参数,,没有传入实现的接口
if(arguments.length<2){
throw new Error("接口检查方法的参数必须多余两个!");
}
//获得要见测的接口实现对象之后的参数 各个接口
for(var i = 1,len = arguments.length;i<len;i++){
var instanceInterface = arguments[i]; //获取当前这个接口
//判断接收到的是不是接口的对象 如果不是 抛出异常
if( instanceInterface.constructor !== Interface){
throw new Error("接口检测函数必须传入接口对象!");
}
//检查实例化接口的对象是不是实现了接口里的所有方法
// 当前接口对象里的每一个方法
for(var j = 0 ; j<instanceInterface.methods.length;j++){
var methodName = instanceInterface.methods[j]; //接收到了字符串的方法名
//如果obj里面没有有methodName这个方法 或者有这个属性但是不是函数 就抛出异常
if(!obj[methodName] || typeof obj[methodName] !== "function"){
throw new Error("接口方法"+ methodName +"没有实现!");
}
}
} };
//传入要检查的类,和他要实现的所有接口对象
Interface.ensureImplements(c ,CompositeInterface ,FormItemInterface );
c.add();

JavaScript实现接口的三种经典方式的更多相关文章

  1. C#接口的三种实现方式

    转自原文C#接口的三种实现方式 public interface MyInterface { /// 下面三个方法的签名都是 /// .method public hidebysig newslot ...

  2. 初见Ajax——javascript访问DOM的三种访问方式

    最近好啰嗦 最近在一间小公司实习,写一些小东西.小公司嘛,人们都说在小公司要什么都写的.果真是. 前端,后台,无论是HTML,CSS,JavaScript还是XML,Java,都要自己全包了.还好前台 ...

  3. JavaScript声明全局变量的三种方式

    JavaScript声明全局变量的三种方式   JS中声明全局变量主要分为显式声明或者隐式声明下面分别介绍. 声明方式一: 使用var(关键字)+变量名(标识符)的方式在function外部声明,即为 ...

  4. 【转】SVG与HTML、JavaScript的三种调用方式

    原文:https://www.cnblogs.com/guohu/p/5085045.html SVG与HTML.JavaScript的三种调用方式 一.在HTMl中访问SVG的DOM 1 2 3 4 ...

  5. JavaScript 闭包的详细分享(三种创建方式)(附小实例)

    JavaScript闭包的详细理解 一.原理:闭包函数--指有权访问私有函数里面的变量和对象还有方法等:通俗的讲就是突破私有函数的作用域,让函数外面能够使用函数里面的变量及方法. 1.第一种创建方式 ...

  6. javascript中构造函数的三种方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. JavaScript中创建对象的三种方式!

    JavaScript中创建对象的三种方式! 第一种 利用对象字面量! // 创建对象的三种方式! // 1 对象字面量. var obj = { // 对象的属性和方法! name: 'lvhang' ...

  8. JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)

    每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...

  9. python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)

    一.model深入 1.model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2.创建数据库表的单表操作 2.1 定义表对象 class xxx(models.M ...

随机推荐

  1. Unity3D相机震动效果

    在一些格斗.射击以及动作类游戏中 相机震动效果是十分重要的 一个平凡的镜头 在关键时刻加入相机震动后 便可以展现出碰撞.危险.打斗以及激动人心的效果 相机震动的实现方式有很多 但都会涉及摄像机位置的变 ...

  2. python 全栈开发,Day4

    python之文件操作 一.文件操作基本流程 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到 ...

  3. 使用Jmeter自带的 Http 代理服务器录制脚本

    最近要测试某个模块的压力测试,所以使用Jmeter录制脚本 1.       打开JMeter工具 创建一个线程组(右键点击“测试计划”--->“添加”---->“线程组”) 创建一个ht ...

  4. 11 个简单的 Java 性能调优技巧

    大多数开发人员理所当然地以为性能优化很复杂,需要大量的经验和知识.好吧,不能说这是完全错误的.优化应用程序以获得最佳性能不是一件容易的事情.但是,这并不意味着如果你不具备这些知识,就不能做任何事情.这 ...

  5. Java 面试宝典-2017

    http://www.cnblogs.com/nelson-hu/p/7190163.html Java面试宝典-2017   Java面试宝典2017版 一. Java基础部分........... ...

  6. Sqlite库的基本操作

    Sqlite 基本操作 打开数据库 sqlite3* SQ_DB; char *zErrMsg = 0; int nRes = sqlite3_open("test.db", &a ...

  7. 网络通信 --> 互联网协议(一)

    互联网协议 一.概述 如何分层有不同的模型,有的模型分七层,有的分四层.这里介绍把互联网分成五层. 最底下的一层叫做"实体层"(Physical Layer),最上面的一层叫做&q ...

  8. Java创建线程的三种方式

    一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实 ...

  9. IO流回顾与总结第一篇之字节流与字符流的操作。。。。。

    一.引言 趁着年后的这点时间,抓紧点时间回顾下javase中的IO流,以往都是用到那些常用的IO类,这次来个全点的,有不对的地方还请大神指正一下,做到坚持写博的习惯来...... 回归正题,IO流顾名 ...

  10. 网络1712--c语言第一次作业总结

    1.作业亮点 1.1大家均能较为独立自主地完成第一次c语言作业,无明显抄袭现象 1.2 以下几位同学博文写的较为优秀,可作为范例供大家参考 田亚琴--态度端正,及时回复评论并及时完善修改博文 戴洁-- ...