系列内容是对 js设计模式 书的学习消化, 代码多来子这本书, 或者在此书代码上的改进,接口是传统面向对象最经常使用到的工具, 如java, c++, c#, 接口即规范, 规定了对象应该有哪些名字的属性和方法, 他只规定这种规范有哪些, 但不具体实现, 具体的类由类来实现, 进而由类建立的对象为该类的事例, 天然也听从此规范javascript
面向接口编程在大型的软件系统中是很是重要的, 接口是对类的抽象画, 是对类功能需求的规范, 面向接口编程有一些列的有点和缺点, 在这里不加点评, 总之能够在须要的地方使用不一样的技术java
javascript做为一门表现力极强的语言得益于它的弱类型特色, 接口的使用在必定程度上强化了类型的做用, 下降灵活性, 因此js并无接口功能, 但正由于js灵活, 实现起来并不是难事node
首先来举一个例子, 实际生活中开发商(开发别墅)和住户是开发商建好房子后由住户观看户型来肯定是否购买, 如今咱们反过来定制别墅库, 用户根据自身需求来定制本身的别墅c++
下面以下图来讲明接口, 类 对象的关系, 途中客户只规定本身对于房屋的需求报给开发商, 开发商根据需求能够谋划出不一样的实现了该需求的图纸, 能够根据不一样图纸来建造房子, 这些房子遵循相同的规范, 编程
接口的实现c#
var Interface =(function(){ // 接口类 var Interface = function(name,methods){ if(arguments.length != 2){ throw new Error("参数数量不对,指望传入两个参数,可是只传入了"+arguments.length+"个参数"); } this.name = name; this.methods = []; for(var i = 0, len = methods.length; i < len; i++){ if(typeof methods[i] !== "string"){ throw new Error("指望传入的方法名是以字符串的格式类型,而不是"+ (typeof methods[i]) + "类型"); } this.methods.push(methods[i]); } } // 测试对象是否实现接口方法 Interface.ensureImplements = function(object){ if(arguments.length < 2){ throw new Error("指望传入至少两个参数,这里仅传入"+arguments.length+"个参数"); } for(var i = 1; i < arguments.length; i++){ var interf = arguments[i]; if(!(interf instanceof Interface)){ throw new Error(arguments[i] + "不是一个接口"); } for(var j = 0, methodsLen = interf.methods.length; j < methodsLen; j++){ var method = interf.methods[j]; if(!object[method] || typeof object[method] !== "function"){ throw new Error("对象的方法 "+method+" 与接口 "+interf.name+" 定义的不一致"); } } } } return Interface; })() //************************************ //接口 var Live = new Interface('Live',['eat','speak']); var ComPro = new Interface('ComPro',['usb', 'sci', 'spi', 'I2C']); // 定义一个Robot类实现Live、ComPro接口 var Robot = function(){ }; Robot.prototype = { // 实现Live接口 eat: function(){ console.log("I can eat"); }, speak: function(){ console.log("I can speak Chinese"); }, // 实现ComPro接口 usb: function () { console.log('use usb'); }, sci: function () { console.log('use sci'); }, spi: function () { console.log('use spi'); }, I2C: function () { console.log('use I2C'); } }; var myRobot = new Robot(); function useRobot(robot){ Interface.ensureImplements(robot, Live, ComPro); robot.eat(); robot.speak(); robot.spi(); robot.usb(); }
接口的做用为类提供规范和限制, 这和 js 灵活性相背离, 但在大型软件开发中, 这种规范能够提升程序的可读性和可拓展性, 偏偏是所推崇的, 随着 node 在后端的兴起, 面向接口编程的思想有必要js开发重视