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; 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 a STRING"); } this.methods.push(methods[i]); } }; //define a interface: var NewInterface = interface('NewInterface',[funa,funb...]); 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(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 instance 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:does not implement the " + interface.name + "interface.Method" + method + "was not found."); } } } } //Interface.ensureImplements(object,interface_a,interface_b);
鸭辨式的写法是我觉得比较好的一种接口方式。
只要在成品之前检测完后删掉就可以。
首先定义一个接口
var NewInterface = interface('NewInterface',[funa,funb...]);
名字就是NewInterface
然后进行检测
Interface.ensureImplements(object,interface_a,interface_b);
注意object是需要检测是否实现接口的对象【注意必须是实例化以后的对象,因为javascript的原型链比较繁】。