1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  2. "http://www.w3.org/TR/html4/loose.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <script charset="UTF-8" type="text/javascript">
  7. /**
  8. * 创建接口类
  9. */
  10. function Interface(name,methods){
  11. if(arguments.length<2){
  12. throw new Error('需要传递两个参数');
  13. }
  14. this.name = name;
  15. this.methods = [];
  16. for(var i = 1;i<methods.length;i++){
  17. var methodName = methods[i];
  18. if(typeof methodName !=='string'){
  19. throw new Error('方法要为字符串类型');
  20. }
  21. this.methods.push(methodName);
  22. }
  23. }
  24. var CompositeInterface = new Interface('CompositeInterface',['add','remove']);
  25. var FormItemInterface = new Interface('FormItemInterface',['select','update']);
  26. /**
  27. * 创建实现类
  28. */
  29. function MyImpl(){
  30. }
  31. /**
  32. * 实现接口
  33. */
  34. MyImpl.prototype.add = function(){
  35. alert('add...');
  36. }
  37. MyImpl.prototype.remove = function(){
  38. alert('remove...');
  39. }
  40. MyImpl.prototype.select = function(){
  41. alert('select...');
  42. }
  43. // MyImpl.prototype.update = function(){
  44. // alert('update...');
  45. // }
  46. /**
  47. * 检测是否实现接口中的所有方法
  48. */
  49. Interface.ensureImplements = function(object){
  50. if(arguments.length<2){
  51. throw Error('参数个数不能小于2个');
  52. }
  53. for(var j=1;j<arguments.length;j++){
  54. var interfaceInstance = arguments[j];
  55. if(interfaceInstance.constructor !==Interface){
  56. throw new Error(interfaceInstance+'不是所需接口实例');
  57. }
  58. for(var i = 0;i<interfaceInstance.methods.length;i++){
  59. var methodName = interfaceInstance.methods[i];
  60. if( !object[methodName] || typeof object[methodName] !=='function'){
  61. throw new Error(methodName+'不是函数或没有被实现');
  62. }
  63. }
  64. }
  65. }
  66. var c1 = new MyImpl();
  67. Interface.ensureImplements(c1,CompositeInterface,FormItemInterface);
  68. c1.add();
  69. </script>
  70. </head>
  71. <body>
  72. </body>
  73. </html>

javascript鸭式辩型法实现接口的更多相关文章

  1. js 鸭式辨型法

    无意中看到arr.length === +arr.length;这句代码,然后就去了解了下 这是一种鸭式辨型的判断方法. 鸭式辨型:像鸭子一样走路.游泳和嘎嘎叫的鸟就是鸭子 这句话表示: a.arr有 ...

  2. js类型判断及鸭式辨型

    目录 instanceof constructor 构造函数名字 鸭式辨型 三种检测对象的类方式: instanceof.constructor .构造函数名字 用法如下: 1)instanceof ...

  3. JavaScript 隐式类型转换

    JavaScript 隐式类型转换 原文:https://blog.csdn.net/itcast_cn/article/details/82887895 · 1.1 隐式转换介绍 · 1.2 隐式转 ...

  4. javascript类式继承最优版

    直接看实例代码: <!doctype html> <html lang="en"> <head> <meta charset=" ...

  5. JavaScript正则式入门

    正则式 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表通常被用来检索.替换那些符合某个模式(规 ...

  6. Javascript 链式作用域 function fn(){}和var fn=function(){}区别

    其实对于Javascript链式作用域的描述,包括,JS权威指南,都有些太冗长了--但是很准确:JavaScript中的函数运行在他们被定义的作用域里,而不是他们被执行的作用域里. 这句话有点难懂,但 ...

  7. javascript链式运动框架案例

    javascript链式运动框架 任务描述: 当鼠标移入红色矩形时,该矩形宽度逐渐增加至400px,之后高度逐渐增加至400px; 当鼠标移出红色矩形时,该矩形高度逐渐减小至200px,之后宽度逐渐减 ...

  8. javascript隐式转换详解

    Javascript是web前端开发的必学技术,今天和大家分享的就是javascript的基础知识隐式转换,希望可以帮助大家更好的学习. 转换成布尔类型假 undefined->falSe nu ...

  9. Javascript 链式运动框架——逐行分析代码,让你轻松了解运动的原理

    所谓链式运动,就是一环扣一环.我们的很多运动实际上来说指的就是分阶段的,第一个阶段动完,下个阶段开始动. 这个链式运动框架就是用来处理这些问题的. 我们先来看下之前的运动框架,以下是Javascrip ...

随机推荐

  1. Badboy使用数据源Excel进行脚本参数化

    1.首先新建一个Excel,这里示例我写得非常简单,由两由数据组成,第一行为表头.见下图: 2.录制脚本,见上一篇,录制一个非常简单的搜狗查询 3.添加数据源,在Tools面板中找到Data Sour ...

  2. Java类额应用

    基本数据类型包装类  Integer    Character  其他的都是将首字母大写;   包装类和基本类型之间的转换:  Integer   int Integer i = new  Integ ...

  3. git ssh端口号变更之后所需要的修改

    假设原本的repository地址为:git@gitlab.cjx.com:jinxin/project2.git 端口变更之后,需要调整为:ssh://git@gitlab.cjx.com:PORT ...

  4. [转]Direct3D 11 Tessellation Tutorial

    The new hardware tessellation feature available on Direct3D 11 video cards has great potential, but ...

  5. ICMP Protocol

    [ICMP Protocol] 参考: 1.ICMP Types and Codes:http://www.nthelp.com/icmp.html 2.RFC 792 - Internet Cont ...

  6. jdk环境变量的配置并检测是否配置成功

    JDK环境变量配置进行java开发,首先安装JDK,安装后进行环境变量配置1,下载JDK(http://java.sun.com/javase/downloads/index.jsp)2.安装jdk- ...

  7. spark job, stage ,task介绍。

    1. spark 如何执行程序? 首先看下spark 的部署图: 节点类型有: 1. master 节点: 常驻master进程,负责管理全部worker节点. 2. worker 节点: 常驻wor ...

  8. 枚举全排列(包括数列中有重复数)的C语言实现

    据说是用了DFS的思想--然鹅并不知道这是DFS. 主要就是选取一个数放到数组相应位置上,然后递归的排列剩下的数组,将剩下的数组递归排列完了之后再把数放回去,然后这一层递归就返回了-- 有重复数的话遇 ...

  9. sql server 分页存储过程

    ----------------------分页存储过程------------------------------------------------------------------------ ...

  10. 控制反转IOC与依赖注入DI

    理解 IOC  http://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html IOC 相关实例      的http:// ...