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. XproerIM V2开源,基于XproerUI引擎构架

    资源下载:XproerIM源代码(访问密码:2e47),imServer(访问密码 364c), 技术交流群:6259765 技术支持:3040217208 咨询邮箱:2190615607@qq.co ...

  2. NET Core1.0之CentOS平台开发控制台程序DEMO

    微软发布NET Core1.0正式版本,并支持了red hat linux平台,所以在CentOS平台,通过编辑器玩下控制器程序. 一.安装.NET Core SDK 先下载SDK并放在指定目录. s ...

  3. 使用新浪云 Java 环境搭建一个简单的微信处理后台

    前一段时间,写了一篇在新浪云上搭建自己的网站的教程,通过简单构建了一个 maven 的项目,展示部署的整个流程,具体的操作可以参看这里. 新浪云服务器除了可以搭建自己的网站以外,也非常的适合作为微信公 ...

  4. DDR控制

    先看下micron公司对DDR3命名的规则: 在设置xilinx ISE中的DDR时 在选择芯片时,不清楚该怎么选择. 请教汤工,给出的答案是Speed等级高的可以兼容等级低的芯片,个在实验之中用的是 ...

  5. dojo创建tree

    今天介绍dojo目录树的效果,效果如下图: HTML代码如下: <body class="claro"> <div id="rootlessTree&q ...

  6. chVsprintf

    #if LINUX_SYSTEM int chVsprintf(LPSTR buffer, int nCount, LPCSTR format, va_list argptr) { return vs ...

  7. EXCEL拼接SQL

    =CONCATENATE("insert into 表名 (字段名1,字段名2)values (3,  '"&C3&"');") 用CONCAT ...

  8. python集合(set)操作

    python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和 ...

  9. 新的框架,新的感觉ASP.NET MVC 分享一个简单快速适合新手的框架

    在ASP.NET世界中摸爬滚打好几年,用过了各种框架,在最初的ASP.NET web from 到现在的MVC 在起初的经典三层,到现在的MVC  IOC  注入 . 突然发现,有些时候真不是跟风用一 ...

  10. 统一资源定位符URL类

    package j2se.core.net.base; import java.io.BufferedReader;import java.io.IOException;import java.io. ...