javascript中模仿接口(interface)
没想到javascript还可以模拟接口,顿时觉得js更加强大,所以把《javascript设计模式》的内容摘录出来,供大家学习,内容稍有改动.
1.在javascript中引入接口的好处:
接口具有自我描述性,可以促进代码的重用;有利于不同的类之间进行通信,在大型项目中尤其有用;有利于代码的测试和调试。
2.引入接口的弊端
接口的引入强化了类型的作用,降低了语言的灵活性;带来额外的开销;无法强迫其他程序员遵守你定义的接口。
3.模仿接口的方法
方法1:用注释描述
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:用属性检查模拟接口
/*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类的定义
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 }
接下来模拟接口:
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)相关推荐
- 介绍Unreal Engine 4中的接口(Interface)使用C++和蓝图
这个教程是从UE4 Wiki上整理而来. 在C++中直接使用Interface大家应该很熟悉.只是简单先定义一个个有虚函数的基类,然后在子类中实现相应的虚函数.像这样的虚函数的基类一般概念上叫接口.那 ...
- php中的网络接口,php中的接口interface
* 接口 * 1.使用关键字:interface * 2.类是对象的模板,接口是类的模板 * 3.接口看作是一个特殊的类 * 4.接口中的方法,只声明不实现,与抽象类一样 * 5.接口中的方法必须是p ...
- java interface_Java中的接口(interface)
Java中提倡面向接口编程,而不是面向类编程,个人理解就是将做什么和怎么做分开,以实现松耦合的目的. 基本数据类型分四类八种 : 整型.浮点型.字符型.布尔型: 引用数据类型分三种 : 类 . 接口 ...
- JavaScript设计模式: 接口模仿
JavaScript中模仿接口有三种方法 1. 注释法 /* interface Composite(){function add(child);function remove(child);func ...
- JavaScript是否具有接口类型(例如Java的“接口”)?
本文翻译自:Does JavaScript have the interface type (such as Java's 'interface')? I'm learning how to make ...
- [ Typescript 手册] JavaScript `Array` 在 Typescript 中的接口
[ Typescript 手册] JavaScript `Array` 在 Typescript 中的接口 本文地址:https://blog.csdn.net/qq_28550263/article ...
- [ Typescript 手册] JavaScript `Date` 在 Typescript 中的接口
给出Date对象接口中文注释,以便查询 JavaScript Date 在 Typescript 中的接口 /** 支持日期和时间的基本存储和检索. */ interface Date {/** 返回 ...
- php中的抽象类(abstract class)和接口(interface)
一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...
- 面向对象编程语言中的接口(Interface)
在大多面向对象的编程语言中都提供了Interface(接口)的概念.如果你事先学过这个概念,那么在谈到"接口测试"时,会不会想起这个概念来!?本篇文章简单介绍一下面向对象编程语言中 ...
- Java 中接口 interface 实例介绍
接口(interface) 有时必须从几个类中派生出一个子类,继承它们所有的属性和方法.但是,Java不支持多重继承.有了接口,就可以得到多重继承的效果. 接口(interface)是抽象方法和常量值 ...
最新文章
- python输入函数格式_python如何提取.c文件中的指定函数的输入参数
- ACM 模板--链接表 无向图
- exit命令的返回值
- c语言作业统计字符,C语言统计字符数(示例代码)
- laravel基本信息
- CSS ::before 和 ::after 伪元素用法
- Palantir:野心贼大,想做世界的创新引擎(附纪要)| 国君计算机李沐华
- 1.1 线性方程组(线性代数及其应用-第5版-系列笔记)
- 锐捷校园网使用python登录
- 将两块球形橡皮泥揉在一起,捏成一个正方体。请编程,完成下述功能:从键盘读入2个球形橡皮泥的直径,直径为浮点数;求正方体的边长,并保留两位小数输出;
- Fedora14 基于Qt的UDP传输文字聊天小软件实现 (Qt查询本地Ip、Qt本地时间显示、传输中文汉字实现、Qt的textedit自动滚屏实现、给QPushButton设键盘快捷实现)---续上
- python计算圆周率_Python圆周率计算
- MSDN 我告诉你 window实用软件下载地址
- Maven在pom文件中添加资源插件后,src/main/resource目录中的文件编译后不拷贝解决方法。
- 如何使用 Unity制作微信小游戏,微信小游戏制作方案 最新完整详细教程来袭【持续更新】
- angular启动项目报错:ERROR in The target entry-point “primeng/editor“ has missing dependencies:
- 苹果怎么办到?AI技术让HomePod语音助理Siri听到
- java 列表面板_java-用JPanels列表制作表
- 音乐节拍 C组模拟赛
- 构建企业级多元数据库的信创DBaaS平台-2022云和恩墨大讲堂
热门文章
- OpenLayers 在Vue中增删改
- js去掉a链接点击后产生的虚线(兼容火狐)
- 07. 千万不要重载、||和, 操作符
- JavaWeb知识点
- java mysql 单例模式_java 单例模式(singleton)连接 mysql 数据库
- pandas之Series()菜鸟教程
- pandas之交叉表crosstab()
- php中fgetss函数,fgetss-函数用法_PHP教程
- 学python将来做什么工作_学Python编程能做什么工作?从事什么岗位?——这些问题你知道吗?...
- 面向对象(Python):学习笔记之单例模式