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. AJAX避免服务器调用上个页面缓存的办法

    GET 请求 一个简单的 GET 请求: xmlhttp.open("GET","demo_get.asp",true); xmlhttp.send(); 亲自 ...

  2. iphone 开源汇总(转)

    原文地址 http://blog.csdn.net/devday/article/details/6105793 扫描wifi信息: http://code.google.com/p/uwecaugm ...

  3. Struts2 的 值栈和ActionContext

    1.ValueStack 和 ActionContext 的关系与区别: -- 相同点:它们都是在一次HTTP请求的范围内使用的,它们的生命周期都是一次请求 -- 不同点:ValueStack 分为对 ...

  4. Ubuntu 16.10下的 jdk 1.8.0_111

    下载好对应版本的jdk copy到此目录下,并解压: 呼出终端,输入指令: gedit ~/.bashrc 会出现文本编辑界 export JAVA_HOME=/usr/lib/jvm/jdk1.8. ...

  5. centos分区

    /boot :用来存放与 Linux 系统启动有关的程序,比如启动引导装载程序等,建议大小为 100MB . /usr :用来存放 Linux 系统中的应用程序,其相关数据较多,建议大于 3GB 以上 ...

  6. 试一下SVG

    用鼠标点击那个圆形试试 function changeCircle() { var c = document.getElementById("mycircle"); c.setAt ...

  7. XML中特殊字符转义

    /// <summary> /// 特殊字符转义 /// </summary> /// <param name="xml"></param ...

  8. 'Missing recommended icon file - The bundle does not contain an app icon for iPhone / iPod Touch of exactly '120x120' pixels, in .png format'

    创建120像素的高分辨率和60个像素定期如上,苹果文档中提到,并设置名称的新图标.例如,icon-120.png和icon-152.png. 将这个图标到你的项目资源文件夹并添加该图标到项目: 在此之 ...

  9. NGUI 按钮点击音效统一管理开启与关闭

    之前就只是简单的在每个按钮(或者需要绑定单击事件的UISprite)对象上添加PlaySound组件,但这样就无法统一去设置按钮单击音效的开启与关闭! 由于我都是使用UIEventListener.G ...

  10. Sublime Text3 (转) 配置 以及快捷键配置

    一.介绍 Sublime Text 是一款较新的编辑器,它轻量.简洁.高效,良好的扩展性以及跨平台等特性,使得越来越多的开发人员喜爱.它是一款收费的商业软件,但可以免费无限制无限期的试用,只会偶尔提醒 ...