最完美的js实现接口的方式 // JavaScript Document//鸭式辩型法 实现接口(最完美的js实现接口的方式)//实现核心:一个类实现接口的主要目的:把接口里的方法都实现(可以检测接口的方
// JavaScript Document //鸭式辩型法 实现接口(最完美的js实现接口的方式) //实现核心:一个类实现接口的主要目的:把接口里的方法都实现(可以检测接口的方法是否实现) //优点:完全面向对象 代码实现统一 解耦性好 // 01 创建接口类 class interface 可以实例化多个接口 // 参数1:接口名 参数2:接收方法名称的数组(array) var LXK = {}; //命名空间 LXK.Interface = function(name, methods) { //判断接口的参数个数 if(arguments.length != 2) { throw new Error('接口实例对象参数长度必须为2'); } this.name = name; this.methods = []; //定义空数组接收方法名 //遍历方法名数组,防止方法名错误 for(var i = 0; i < methods.length; i++) { if(typeof methods[i] !== 'string') { throw new Error("接口方法名'" + methods[i] + "'类型错误"); } this.methods.push(methods[i]); } } //实例化两个接口 //var CompositeInterface = new LXK.Interface(CompositeInterface,['add','remove']); //var FormItemInterface = new LXK.Interface(FormItemInterface,['update','select']); //________________________________________________________________________ /* //接口实现类 function CompositeImpl(){ } //实现接口中的方法 CompositeImpl.prototype.add = function(obj){ //do something alert('add...'); } CompositeImpl.prototype.remove = function(obj){ //do something } CompositeImpl.prototype.update = function(obj){ //do something }; CompositeImpl.prototype.select = function(obj){ //do something } */ //_____________________________________________________________________ //检测接口里的方法是否在实现类中实现(核心方法) //检验通过,不做操作,检验失败,抛出异常 LXK.Interface.ensureImplements = function(object) { //接口检测方法接收的参数小于两个,参数传递失败 if(arguments.length < 2) { throw new Error('接口检测的方法的参数必须 >=2 !'); } //传入的参数中,第一个是检验的对象,后面的才是要检验的接口 for(var i = 1; i < arguments.length; i++) { //接收要检验的接口对象 var instanceInterface = arguments[i]; //判断参数是否是接口类型 if(instanceInterface.constructor !== LXK.Interface) { throw new Error("参数'" + instanceInterface + "'不是一个接口"); } //遍历接口实例对象中的每一个方法 for(var j = 0; j < instanceInterface.methods.length; j++) { //用一个临时变量接收每一个方法的名字 var methodName = instanceInterface.methods[j]; //检验实例对象中是否有该方法 if(!object[methodName] || typeof object[methodName] !== 'function') { throw new Error("方法名'" + methodName + "'不存在,未完全实现接口"); } } } } //var c = new CompositeImpl(); //检测实例对象 c 中是否有后面的两个接口 //LXK.Interface.ensureImplements(c,CompositeInterface,FormItemInterface); //c.add();