没想到javascript还可以模拟接口,顿时觉得js更加强大,所以把《javascript设计模式》的内容摘录出来,供大家学习,内容稍有改动.

1.在javascript中引入接口的好处:

接口具有自我描述性,可以促进代码的重用;有利于不同的类之间进行通信,在大型项目中尤其有用;有利于代码的测试和调试。


2.引入接口的弊端

接口的引入强化了类型的作用,降低了语言的灵活性;带来额外的开销;无法强迫其他程序员遵守你定义的接口。


3.模仿接口的方法

方法1:用注释描述

View Code

 1 /*
 2   interface  composite{
 3     function add(child);
 4     function remove(child);
 5     function getChild(index);
 6   }
 7   interface FormItem{
 8     function save();
 9   }
10 */
11 var CompositeForm = function(){
12     ...
13 }
14
15 CompositeForm.prototype = {
16     add: function(child){...},
17     remove: function(child){...},
18     getChild: function(index){...},
19     save: function(){...}
20 }

该方法的不足:主要属于程序文档的范围,对接口的遵守完全依靠自觉。

方法2:用属性检查模拟接口

View Code

/*interface  composite{function add(child);function remove(child);function getChild(index);}interface FormItem{function save();}
*/var CompositeForm = function(){this.implementsInterfaces = ['Composite','FormItem'];...}function addForm(formInstance){if(! implements(formInstance,'Composite','FormItem')){throw new Error('object does not omplement a required interface');}...}function implements(object){for(var i=1;i<arguments.length;i++){var interfaceName = arguments[i];var found = false;for(var j=0;j<object.implementsInterfaces.length;j++){if(object.implementsInterfaces[j] === interfaceName){found = true;break;}}if(! found){return false;   //an interface was not found
        }}return true;
}

该方法的特点是显示地声明自己支持什么接口,但是并未确保类真正实现了自称的接口。

方法3.鸭式变型模拟接口

首先是Interface类的定义

View Code

 1 var Interface = function(name,methods){
 2     if(arguments.length != 2){
 3         throw new Error('....');
 4     }
 5     this.name = name;
 6     this.methods = [];
 7     for(var i=1; i< methods.lenght;i++){
 8         if(typeof method[i] !== 'string'){
 9             throw new Error(...);
10         }
11         this.methods.push(methods[i]);
12     }
13 }
14 Interface.ensureImplements = function(object){
15     if(arguments.length < 2){
16         throw new Error(...);
17     }
18     for(var i=1;i<arguments.lenght;i++){
19         var interfaceName = arguments[i];
20         if(interfaceName.constructor !==Interface){
21             throw new Error(...);
22         }
23         for(var j=0; j<interfaceName.methods.length;j++){
24             var method = interfaceName.methods[j];
25             if(!object[method] || typeof object[method] !== 'function'){
26                 throw new Error(...);
27             }
28         }
29     }
30 }

接下来模拟接口:

View Code

 1 /*
 2   interface  composite{
 3     function add(child);
 4     function remove(child);
 5     function getChild(index);
 6   }
 7   interface FormItem{
 8     function save();
 9   }
10 */
11 var Composite = new Interface('Composition',['add','remove','getChild']);
12 var FormItem = new Interface('FormItem',['save']);
13
14 var CompositeForm = function(){
15     ...
16 }
17
18 function addForm(formInstance){
19     Interface.ensureImplements(formInstance,Composite,FormItem);
20     ...
21 }

特点:可以保证强制实施类实现接口,但是缺少自我描述,同时还需要一个辅助类(Interface)和辅助函数(ensureImplements)。


4.结论:

模拟接口最好的办法同时使用注释和鸭式变型方法。其实模拟接口不是最难的,难点在于何时使用接口。

转载于:https://www.cnblogs.com/shamoguying1140/archive/2013/04/18/3028538.html

javascript中模仿接口(interface)相关推荐

  1. 介绍Unreal Engine 4中的接口(Interface)使用C++和蓝图

    这个教程是从UE4 Wiki上整理而来. 在C++中直接使用Interface大家应该很熟悉.只是简单先定义一个个有虚函数的基类,然后在子类中实现相应的虚函数.像这样的虚函数的基类一般概念上叫接口.那 ...

  2. php中的网络接口,php中的接口interface

    * 接口 * 1.使用关键字:interface * 2.类是对象的模板,接口是类的模板 * 3.接口看作是一个特殊的类 * 4.接口中的方法,只声明不实现,与抽象类一样 * 5.接口中的方法必须是p ...

  3. java interface_Java中的接口(interface)

    Java中提倡面向接口编程,而不是面向类编程,个人理解就是将做什么和怎么做分开,以实现松耦合的目的. 基本数据类型分四类八种 : 整型.浮点型.字符型.布尔型: 引用数据类型分三种 : 类 . 接口 ...

  4. JavaScript设计模式: 接口模仿

    JavaScript中模仿接口有三种方法 1. 注释法 /* interface Composite(){function add(child);function remove(child);func ...

  5. JavaScript是否具有接口类型(例如Java的“接口”)?

    本文翻译自:Does JavaScript have the interface type (such as Java's 'interface')? I'm learning how to make ...

  6. [ Typescript 手册] JavaScript `Array` 在 Typescript 中的接口

    [ Typescript 手册] JavaScript `Array` 在 Typescript 中的接口 本文地址:https://blog.csdn.net/qq_28550263/article ...

  7. [ Typescript 手册] JavaScript `Date` 在 Typescript 中的接口

    给出Date对象接口中文注释,以便查询 JavaScript Date 在 Typescript 中的接口 /** 支持日期和时间的基本存储和检索. */ interface Date {/** 返回 ...

  8. php中的抽象类(abstract class)和接口(interface)

    一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...

  9. 面向对象编程语言中的接口(Interface)

    在大多面向对象的编程语言中都提供了Interface(接口)的概念.如果你事先学过这个概念,那么在谈到"接口测试"时,会不会想起这个概念来!?本篇文章简单介绍一下面向对象编程语言中 ...

  10. Java 中接口 interface 实例介绍

    接口(interface) 有时必须从几个类中派生出一个子类,继承它们所有的属性和方法.但是,Java不支持多重继承.有了接口,就可以得到多重继承的效果. 接口(interface)是抽象方法和常量值 ...

最新文章

  1. python输入函数格式_python如何提取.c文件中的指定函数的输入参数
  2. ACM 模板--链接表 无向图
  3. exit命令的返回值
  4. c语言作业统计字符,C语言统计字符数(示例代码)
  5. laravel基本信息
  6. CSS ::before 和 ::after 伪元素用法
  7. Palantir:野心贼大,想做世界的创新引擎(附纪要)| 国君计算机李沐华
  8. 1.1 线性方程组(线性代数及其应用-第5版-系列笔记)
  9. 锐捷校园网使用python登录
  10. 将两块球形橡皮泥揉在一起,捏成一个正方体。请编程,完成下述功能:从键盘读入2个球形橡皮泥的直径,直径为浮点数;求正方体的边长,并保留两位小数输出;
  11. Fedora14 基于Qt的UDP传输文字聊天小软件实现 (Qt查询本地Ip、Qt本地时间显示、传输中文汉字实现、Qt的textedit自动滚屏实现、给QPushButton设键盘快捷实现)---续上
  12. python计算圆周率_Python圆周率计算
  13. MSDN 我告诉你 window实用软件下载地址
  14. Maven在pom文件中添加资源插件后,src/main/resource目录中的文件编译后不拷贝解决方法。
  15. 如何使用 Unity制作微信小游戏,微信小游戏制作方案 最新完整详细教程来袭【持续更新】
  16. angular启动项目报错:ERROR in The target entry-point “primeng/editor“ has missing dependencies:
  17. 苹果怎么办到?AI技术让HomePod语音助理Siri听到
  18. java 列表面板_java-用JPanels列表制作表
  19. 音乐节拍 C组模拟赛
  20. 构建企业级多元数据库的信创DBaaS平台-2022云和恩墨大讲堂

热门文章

  1. OpenLayers 在Vue中增删改
  2. js去掉a链接点击后产生的虚线(兼容火狐)
  3. 07. 千万不要重载、||和, 操作符
  4. JavaWeb知识点
  5. java mysql 单例模式_java 单例模式(singleton)连接 mysql 数据库
  6. pandas之Series()菜鸟教程
  7. pandas之交叉表crosstab()
  8. php中fgetss函数,fgetss-函数用法_PHP教程
  9. 学python将来做什么工作_学Python编程能做什么工作?从事什么岗位?——这些问题你知道吗?...
  10. 面向对象(Python):学习笔记之单例模式