JavaScript接口实现代码 (Interfaces In JavaScript)


Posted in Javascript onJune 11, 2010

在实际中,我们可以在注释中定义好接口,在实际的代码中予以实现
比如:

/* 
interface Composite { 
function add(child); 
function remove(child); 
function getChild(index); 
} 
interface FormItem { 
function save(); 
} 
*/ 
var CompositeForm = function(id, method, action) { // implements Composite, FormItem 
... 
}; 
// Implement the Composite interface. 
CompositeForm.prototype.add = function(child) { 
... 
}; 
CompositeForm.prototype.remove = function(child) { 
... 
}; 
CompositeForm.prototype.getChild = function(index) { 
... 
}; 
// Implement the FormItem interface. 
CompositeForm.prototype.save = function() { 
... 
};

实现接口的程序员是否将这些接口都实现了呢?我们没办法保证!因为这里没有任何办法去检查是否都实现了
我们需要一个检查是否实现了接口的机制,可以这样:
/* 
interface Composite { 
function add(child); 
function remove(child); 
function getChild(index); 
} 
interface FormItem { 
function save(); 
} 
*/ 
var CompositeForm = function(id, method, action) { 
this.implementsInterfaces = ['Composite', 'FormItem']; 
... 
}; 
... 
function addForm(formInstance) { 
if(!implements(formInstance, 'Composite', 'FormItem')) { 
throw new Error("Object does not implement a required interface."); 
} 
... 
} 
// The implements function, which checks to see if an object declares that it 
// implements the required interfaces. 
function implements(object) { 
for(var i = 1; i < arguments.length; i++) { // Looping through all arguments 
// after the first one. 
var interfaceName = arguments[i]; 
var interfaceFound = false; 
for(var j = 0; j < object.implementsInterfaces.length; j++) { 
if(object.implementsInterfaces[j] == interfaceName) { 
interfaceFound = true; 
break; 
} 
} if(!interfaceFound) { 
return false; // An interface was not found. 
} 
} 
return true; // All interfaces were found. 
}

这种方法让程序员在写的时候注明实现了哪些接口: this.implementsInterfaces = ['Composite', 'FormItem']; 在调用的时候使用implements方法来判断是否实现了,理论上可行,很有可能写上了实现了'Composite'接口,但是代码里却并没有add方法!因此,我们需要检验实现接口的类是否包含了接口里的方法!所以,接口必须从注释中解放出来:
// Interfaces. 
var Composite = new Interface('Composite', ['add', 'remove', 'getChild']); 
var FormItem = new Interface('FormItem', ['save']); 
// CompositeForm class 
var CompositeForm = function(id, method, action) { // implements Composite, FormItem 
... 
}; 
... 
function addForm(formInstance) { 
Interface.ensureImplements(formInstance, Composite, FormItem); 
// This function will throw an error if a required method is not implemented, 
// halting execution of the function. 
// All code beneath this line will be executed only if the checks pass. 
... 
}

定义接口Composite,FormItem,并且CompositeForm实现这两个接口,在使用的时候,用Interface.ensureImplements来检验formInstance是否实现了这两个接口中的所有方法。
来看看Interface的定义:两个参数,第一个参数是接口名称,第二个参数是接口包含的方法数组
// Constructor. 
var Interface = function(name, methods) { 
if(arguments.length != 2) { 
throw new Error("Interface constructor called with " + arguments.length + 
"arguments, but expected exactly 2."); 
} 
this.name = name; 
this.methods = []; 
for(var i = 0, len = methods.length; i < len; i++) { 
if(typeof methods[i] !== 'string') { 
throw new Error("Interface constructor expects method names to be " 
+ "passed in as a string."); 
} 
this.methods.push(methods[i]); 
} 
};

为Interface 添加建议接口是否实现的静态方法
// Constructor. 
Interface.ensureImplements = function(object) { 
if(arguments.length < 2) { 
throw new Error("Function Interface.ensureImplements called with " + 
arguments.length + "arguments, but expected at least 2."); 
} 
for(var i = 1, len = arguments.length; i < len; i++) { 
var interface = arguments[i]; 
if(interface.constructor !== Interface) { 
throw new Error("Function Interface.ensureImplements expects arguments" 
+ "two and above to be instances of Interface."); 
} 
for(var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++) { 
var method = interface.methods[j]; 
if(!object[method] || typeof object[method] !== 'function') { 
throw new Error("Function Interface.ensureImplements: object " 
+ "does not implement the " + interface.name 
+ " interface. Method " + method + " was not found."); 
} 
} 
} 
};
Javascript 相关文章推荐
javascript学习笔记(六) Date 日期类型
Jun 19 Javascript
Bootstrap每天必学之下拉菜单
Nov 25 Javascript
关于JS 预解释的相关理解
Jun 28 Javascript
node.js学习之base64编码解码
Oct 21 Javascript
最好用的Bootstrap fileinput.js文件上传组件
Dec 12 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
Mar 22 Javascript
用ES6写全屏滚动插件的示例代码
May 02 Javascript
利用Decorator如何控制Koa路由详解
Jun 26 Javascript
JavaScript使用Math.random()生成简单的验证码
Jan 21 Javascript
layer设置maxWidth及maxHeight解决方案
Jul 26 Javascript
jQuery开发仿QQ版音乐播放器
Jul 10 jQuery
使用PDF.js渲染canvas实现预览pdf的效果示例
Apr 17 Javascript
JavaScript的单例模式 (singleton in Javascript)
Jun 11 #Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
Jun 11 #Javascript
基于jQuery的js分页代码
Jun 10 #Javascript
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
Jun 10 #Javascript
jQuery EasyUI中对表格进行编辑的实现代码
Jun 10 #Javascript
jQuery创建自己的插件(自定义插件)的方法
Jun 10 #Javascript
jQuery-ui中自动完成实现方法
Jun 10 #Javascript
You might like
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
PHP通过API获取手机号码归属地
2015/05/28 PHP
PHP的全局错误处理详解
2016/04/25 PHP
php实现留言板功能
2017/03/05 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
菜单效果
2006/10/14 Javascript
javascript实现的动态添加表单元素input,button等(appendChild)
2007/11/24 Javascript
document.documentElement &amp;&amp; document.documentElement.scrollTop
2007/12/01 Javascript
javascript面向对象入门基础详细介绍
2012/09/05 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
Javascript window对象详解
2014/11/12 Javascript
JavaScript闭包详解
2015/02/02 Javascript
jquery实现二级导航下拉菜单效果
2015/12/18 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
浅析Python基础-流程控制
2016/03/18 Python
python爬虫面试宝典(常见问题)
2018/03/02 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
2020/03/09 Python
Python unittest装饰器实现原理及代码
2020/09/08 Python
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
亚马逊海外购:亚马逊美国、英国、日本、德国直邮
2021/03/18 全球购物
建筑自我鉴定
2013/10/19 职场文书
小区门卫值班制度
2014/01/24 职场文书
春风行动实施方案
2014/03/28 职场文书
创业融资计划书
2014/04/25 职场文书
小学教师师德整改措施
2014/09/29 职场文书
行政二审代理词
2015/05/25 职场文书