『JavaScript』模仿接口
2014-01-27 19:31
260 查看
JavaScript中并没有内置的创建或实现接口的方法。这里将利用JavaScript的灵活性,来实现与接口意义相同的功能。
什么是接口?
接口的好处:接口提供了一种用以说明一个对象应该具有哪些方法的手段。
接口表明方法的语义,但并不规定这些方法应该如何实现。
有了接口,就可以按对象提供的特性对它们进行分级。
面向对象的JavaScript中接口的作用:
既定的一批接口具有自我描述性,并能促进代码的重用。
接口可以帮助对类的使用。
接口有助于稳定不同的类之间的通信方式。
JavaScript中接口的弊端:
接口在一定程度上强化类型的作用,从而降低的JavaScript弱类型的特性。
JavaScript用模仿的方式实现接口的特性,这有一定的风险。
JavaScript中,实现接口的方法都会对性能造成一定的影响,在某种程序上这是因为额外的方法调用的开销。
JavaScript中,无法强制程序员遵守你定义的接口。
在JavaScript中模仿接口
1. 用注释描述接口
/* interface Composite { function add(child); function remove(child); function getChild(index); } */
使用注释来描述接口,很难对接口的实例进行控制。
2. 用属性模仿接口
使用特定的方法来对特定的对象进行检查,看其是否实现了一组对应的方法,从而判断是否符合接口的要求。使用属性模仿接口,主要是在实例声明的地方使用一个数组对象作为实现的接口的描述。然后在使用这个实例的时候,再使用一个存储接口名称的数组对象对其进行一个检查,看是否实现了相应的接口。
这里要注意的是,implementsInterfaces是一个接口保称的数组,arguments的遍历是从1开始,而不是从0开始,因为arguments[0]是传入的待判断对象。
function implements(object) { for (var i = 1; i < arguments.length; i++) { 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 (!intefaceFound) { return false; } } return true; } var CompositeForm = function(id, method, action) { this.implementsInterfaces = ['Composite']; // ... }; function addForm(formInstance){ if(implements(formInstance,'composite')){ throw new Error(Object does not implement a required interface.); } // ... }
这种方法,对类所实现的接口提供了文档说明,如果实例没有实现接口,就会得到一个错误。
但是,这种方法从根本上说,并未确保类真正实现了自称实现的接口。
3. 用鸭式辨型模仿接口
像鸭子一样走路并且嘎嘎叫的就是鸭子。
主要观点:如果对象具有与接口定义的方法同名的所有方法,那么就可以认为它实现了这个接口。
使用这种方法需要一个辅助函数来对实现接口的方法进行判断,看某个对象是否实现了某个接口。
推荐的模仿接口的方法
我们可以使用一个辅助类Interface及其类方法Interface.ensureImplements来对对象实现的方法进行显式检查。var Interface = function(name, methods) { if (arguments.length != 2) { throw new Error("Interface constructor called with " + arguments.length + "arguments, but excepted 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.ensureImplements = function(object) { if (arguments.length < 2) { 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."); } } }
在使用这种方法的时候,我们可以使用Interface作为类型,然后将接口名称以及接口的方法以参数列表的形势传入。然后再在调用这个接口的实例的时候,调用ensureImplements方法进行判断是否实现了这一个接口。
这里我们使用
typeof object[method] !== 'function'检查对象是否包含某个方法。
var ResultSet = new Interface('ResultSet',['getDate','getResults']); var ResultFormatter = function(resultsObject){ Interface.ensureImplements(resultsObject, ResultSet); this.resultsObject = resultsObject; }; ResultFormatter.prototype.rederResults = function(){ // ... };
相关文章推荐
- JavaScript设计模式: 接口模仿
- 在JavaScript中模仿接口
- javascript中模仿接口(interface)
- javascript鸭辨式模仿接口
- React Native JavaScriptModuleRegistry是如何存放入JS接口原型的
- js创建数据共享接口——简化框架之间相互传值_javascript技巧_脚本之家
- webview中JavascriptInterface接口在release包中无法使用的问题
- 调用百度地图的javascript接口来查找地名并标注
- VLC web 插件javascript常用接口及属性
- javascript封装QQ天气预报接口
- JavaScript学习-模仿块级作用域
- JavaScript实现小球运动撞击效果,模仿气泡屏保
- 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP
- 模仿QQ秀(javascript)
- xml数据岛,xsl,javascript,asp.net 的结合使用 web 程序模仿 windows 资源管理器
- 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP
- Mock.js前端 一款可以脱离后台服务器,模仿接口的小东西
- javascript学习(7)——[知识储备]接口
- JavaScript使用接口
- 隐藏帧---javaScript+iframe模仿ajax的点上通讯