JavaScript Interface 接口的实现
JavaScript是弱类型语言,所以类型匹配问题很难追踪。同时,Js并没有像其他语言一样,提供内置的创建或实现接口的方法。这样,在我们进行对象转化的时候是很困难的。
不过,我们还是可以使用程序来模拟JavaScript Interface接口的实现。一般来说,模拟Interface的实现有如下三种方法:
- 注释法――将接口的定义写在注释中,大家能否小心注意,以实现接口的所有方法全凭自觉属性
- 检查法――自己说明我实现了哪些接口,一会儿你检查的时候记得检查我说我实现的接口里面,是否把我真正想要实现的接口全部实现了(这么别扭呢),总之就是自欺欺人
- 鸭式辨型法――像鸭子一样,嘎嘎叫的那么就是鸭子。具有鸭子特性的东西,我们就可以称之为鸭子。能直立行走,会使用工具的除了机器人,都是人。嗯~~
按照书中介绍的,我们也一样彩注释法与鸭式辨型相结合的方法,来模拟Js的接口实现。
以下是代码片段:
// Constructor
/*
* @param name String 接口的名字
* @param methods Array 接口里面定义的方法
*/
var Interface = function(name, methods){
//如果购造函数的参数不等于2个,那么抛出异常
if (arguments.length != 2) {
throw new Error("Interface constructor called with " + arguments.length +
"arguments,but expected exactyl 2.")
}
this.name = name;
this.methods = [];
//方法数组,保证传进来的methods数组中,每一个元素都是字符串类型
for (var i = 0, len = methods.length; i < len; i++) {
if (typeof methods[i] !== "string") {
throw new Error("Interface constructor expects methods names to bo " +
"passed in asastring.");
}
this.methods.push(methods[i]);
}
}
//Static class methods
Interface.ensureImplements = function(object){
//如果参数少于2个,抛出异常,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++) {
//inter_face为接口,一定要实现Interface类
//书中使用interface,因是JavaScript中保留字,所以暂替换为inter_face
var inter_face = arguments[i];
if (inter_face.constructor !== Interface) {
throw new Error("Function Interface.ensureImplementsexpects arguments " +
"two and above to be instances of Interface.");
}
for (var j = 0, methodsLen = inter_face.methods.length; j < methodsLen; j++) {
//对象中是否含有接口中定义的方法
var method = inter_face.methods[j];
if (!object[method] || typeof object[method] !== ’function’) {
throw new Error("Function Interface.ensureImplements: object " +
"does not implements the " +
inter_face.name +
"interface.Method " +
method +
"was not found.");
}
可能大家比较晕,注释写在哪了?答,注释写在调用的页面上。例如:
以下是代码片段: //定义接口Composite,实现add,remove,getChild三种方法 var Composite = new Interface(’Composite’,[’add’,’remove’,’getChild’]); //定义接口FormItem,实现save方法 var FormItem = new Interface(’FormItem’,[’save’]); //判断对象是否实现了上述两个接口 var object = new Class(); Interface.ensureImplements(object,Composite,FormItem); |
建议继续学习:
- Paypal接口详细代码(PHP版,非API接口) (阅读:18360)
- 面向“接口”编程和面向“实现”编程 (阅读:12559)
- PHP连贯接口 (阅读:6363)
- 存储基础知识之——硬盘接口简述 (阅读:6123)
- 干嘛不去掉“I”和“Impl”? (阅读:5671)
- 使用Mitmproxy分析接口 (阅读:5341)
- 接口设计规则一:让你的接口会说话 (阅读:3520)
- 以用户为中心的 API 异常设计 (阅读:2395)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:simaopig 来源: 小小子,simaopig
- 标签: 接口
- 发布时间:2010-07-12 23:26:03
- [67] Go Reflect 性能
- [67] Oracle MTS模式下 进程地址与会话信
- [67] 如何拿下简短的域名
- [61] IOS安全–浅谈关于IOS加固的几种方法
- [60] 图书馆的世界纪录
- [59] 【社会化设计】自我(self)部分――欢迎区
- [58] android 开发入门
- [56] 视觉调整-设计师 vs. 逻辑
- [49] 给自己的字体课(一)——英文字体基础
- [47] 界面设计速成