javascript的接口定义之鸭式辨型
2016-02-20 21:38
761 查看
<!DOCTYPE HTML> <html> <head> <script type="text/javascript"> 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 expected 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 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 implements the " + interface.name + " interface.Method " + method + " was not found."); } } } }; // 定义接口 var DynamicMap = new Interface('DynamicMap', ['centerOnPoint', 'zoom', 'draw']); function displayRoute(mapInstance){ // 接口实现检查 Interface.ensureImplements(mapInstance, DynamicMap); mapInstance.centerOnPoint(24, 13); mapInstance.zoom(5); mapInstance.draw(); } // 对象 function Foo(){ } Foo.prototype = { centerOnPoint : function(x, y){ document.writeln('<br />centerOnPoint: ' + x + ', ' + y); }, zoom : function(level){ document.writeln('<br />zoom: ' + level); }, draw : function(){ document.writeln('<br />draw'); } }; var foo = new Foo(); displayRoute(foo); </script> </head> </html>
相关文章推荐
- [Extjs] Ext4 Ext.grid.Panel 分页实现(mybatis 分页插件-PageHelper 使用)
- JavaScript-Javascript中bind()方法的使用与实现
- JS中避免命名冲突
- 2014年辛星解读Javascript之DOM之冒泡和捕获
- 20160220 - JavaScript for OS X Automation 调试技巧
- JavaScript-bind()与函数绑定
- JavaScript——注册表单参考模板(含参数格式校验)
- JavaScript去除空格的三种方法(正则/传参函数/trim)
- js数组去重
- 多文件上传 file-uploader.js
- js对象简单、深度克隆(复制)
- JavaScript-JS优化与惰性载入函数
- js 作为属性的变量
- jstack_查看当前进程及所属线程执行情况
- [Cycle.js] Hyperscript as our alternative to template languages
- 如何判断js中的数据类型
- JavaScript数据类型
- 2、JavaScript常用互动方法
- JavaScript中异步编程
- javascript变量声明提升(hoisting)