什么是接口
接口是面向对象JavaScript程序员的工具箱中最有用的工具之一。在设计模式中提出的可重用的面向对象设计的原则之一就是“针对接口编程而不是实现编程”,即我们所说的面向接口编程,这个概念的重要性可见一斑。但问题在于,在JavaScript的世界中,没有内置的创建或实现接口的方法,也没有可以判断一个对象是否实现了与另一个对象相同的一套方法,这使得对象之间很难互换使用,好在JavaScript拥有出色的灵活性,这使得模拟传统面向对象的接口,添加这些特性并非难事。接口提供了一种用以说明一个对象应该具有哪些方法的手段,尽管它可以表明这些方法的含义,但是却不包含具体实现。有了这个工具,就能按对象提供的特性对它们进行分组。例如,假如A和B以及接口I,即便A对象和B对象有极大的差异,只要他们都实现了I接口,那么在A.I(B)方法中就可以互换使用A和B,如B.I(A)。还可以使用接口开发不同的类的共同性。如果把原本要求以一个特定的类为参数的函数改为要求以一个特定的接口为参数的函数,那么所有实现了该接口的对象都可以作为参数传递给它,这样一来,彼此不相关的对象也可以被相同地对待。
代码实现
interface 类 实现的接口
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('方法名要传入字符串');
}
this.methods.push(methods[i]);
}
}
Interface.ensureImplements = function(object){
if(arguments.length < 2){
throw new Error('参数小于两个');
}
for(var i = 1,len = arguments.length;i<len;i++){
var interface = arguments[i];
if(arguments[i].constructor != Interface){
throw new Error('请实现接口');
}
for(var j = 0,metLen = arguments[i].length;j<metLen;j++){
var methods = interface.methods[j];
if(!object[methods] || typeof object[methods] != 'function'){
throw new Error('请实现接口');
}
}
}
}
var DynamicMap = new Interface('DynamicMap',['centerOnPoint','zoom','draw']);
function displayRoute(mapInstance){
Interface.ensureImplements(mapInstance,DynamicMap);
mapInstance.centerOnPoint(12,34);
mapInstance.zoom(5);
mapInstance.draw();
}
var a={
centerOnPoint:function(x,y){
console.log(x*y);
},
zoom:function(x){
console.log(x);
},
draw:function(){
console.log("x*y");
}
}
displayRoute(a);