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. [Altera]PLL仿真

    EDA Tools: 1.Quartus II 13.1(64-bit) 2.Modelsim SE-64 10.1c Time: 2016.05.05 ----------------------- ...

  2. XproerUI控件工厂代码优化-使用C++11特性优化

    优化前的代码,比较冗余,通常实现一个工厂类的创建器需要三个步骤. 代码截图: 优化后的代码,更简洁,对开发人员更加友好,实现一个工厂类创建器只需要一个步骤. 代码截图:

  3. ViewPager如下效果你研究过吗?

    1:ViewPager实现欢迎页面动画效果 ViewPager实现欢迎页面动画滑动切换view效果,页面切换添加优美的动画, //主要代码实现 public void animateSecondScr ...

  4. <![CDATA[ ]]> 的作用

    在xml文件中 一些特殊字符需要去除其本意,就要用到 <![CDATA[    ]]>,,比如 ibitis的sqlmap.xml 中  要比较大小不能直接用 < 或者 > , ...

  5. Python3利用BeautifulSoup4批量抓取站点图片的代码

    边学边写代码,记录下来.这段代码用于批量抓取主站下所有子网页中符合特定尺寸要求的的图片文件,支持中断. 原理很简单:使用BeautifulSoup4分析网页,获取网页<a/>和<im ...

  6. 关于 Netty Channel 的 Autoread

    Netty 4 的 Channel 多了一个 autoread 参数, 它的用处是在让 channel 在触发某些事件以后(例如 channelActive, channelReadComplete) ...

  7. nodejs npm常用命令

    npm是一个node包管理和分发工具,已经成为了非官方的发布node模块(包)的标准.有了npm,可以很快的找到特定服务要使用的包,进行下载.安装以及管理已经安装的包. 1.npm install m ...

  8. c# long转 datetime

    ; DateTime start = , , , , , , DateTimeKind.Utc); DateTime date = start.AddMilliseconds(time).ToLoca ...

  9. 非阻塞同步算法实战(二)-BoundlessCyclicBarrier

    本人是本文的作者,首发于ifeve(非阻塞同步算法实战(二)-BoundlessCyclicBarrier) 前言 相比上一 篇而言,本文不需要太多的准备知识,但技巧性更强一些.因为分析.设计的过程比 ...

  10. h5整理--详解css的相对定位和绝对定位

    浏览器默认状态下position的属性默认值是static也就是没有定位,元素出现在正常的文档流中,这个时候给元素设置的left,right.bottom.top这些偏移属性是没有效果的,不会生效: ...