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 相关文章推荐
js checkbox(复选框) 使用集锦
Apr 28 Javascript
javascript通过navigator.userAgent识别各种浏览器
Oct 25 Javascript
table行随鼠标移动变色示例
May 07 Javascript
javascript 面向对象封装与继承
Nov 27 Javascript
浅析JavaScript中命名空间namespace模式
Jun 22 Javascript
Vue.js在使用中的一些注意知识点
Apr 29 Javascript
vue2.0.js的多级联动选择器实现方法
Feb 09 Javascript
JavaScript类的继承方法小结【组合继承分析】
Jul 11 Javascript
微信小程序拖拽排序列表的示例代码
Jul 08 Javascript
JavaScript实现刮刮乐效果
Nov 01 Javascript
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
vue router 动态路由清除方式
May 25 Vue.js
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
一个php导出oracle库的php代码
2009/04/20 PHP
Linux安装配置php环境的方法
2016/01/14 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
关于firefox的ElementTraversal 接口 使用说明
2010/11/11 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
实现web打印的各种方法介绍及实现代码
2013/01/09 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
深入理解javascript的getTime()方法
2017/02/16 Javascript
js css自定义分页效果
2017/02/24 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
jQuery鼠标移动图片上实现放大效果
2017/06/25 jQuery
JavaScript中重名的函数与对象示例详析
2017/09/28 Javascript
ReactJS实现表单的单选多选和反选的示例
2017/10/13 Javascript
微信小程序商品详情页规格属性选择示例代码
2017/10/30 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
JavaScript使用canvas绘制随机验证码
2020/02/17 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
Python3 pandas 操作列表实例详解
2019/09/23 Python
Pytorch 中retain_graph的用法详解
2020/01/07 Python
关于Python字符串显示u...的解决方式
2020/03/06 Python
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
教师个人自我剖析材料
2014/09/29 职场文书
先进典型事迹材料
2014/12/29 职场文书
2015年医药代表工作总结
2015/04/25 职场文书
党小组评议意见
2015/06/02 职场文书
导游词之无锡丝业博物馆
2019/11/12 职场文书
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL
清空 Oracle 安装记录并重新安装
2022/04/26 Oracle