interface Animal{
    public void eat;
    public void sleep;
}

class Person implements Animal{
    public void eat(){
        ...
    }
    public void sleep(){
        ...
    }
}
interface Animal{
    public void eat;
    public void sleep;
}

class Person implements Animal{
    public void eat(){
        ...
    }
    public void sleep(){
        ...
    }
}

以上是我们熟悉的java代码中的接口定义及其实现。

但是我们想要在js中实现类似的接口功能怎么办呢?

首先,我们要明确接口是用来声明一个类行为的,而不去做具体的功能实现,而实现该接口的类则必须要实现接口中声明的方法。因而我们需要一个类来表示接口的声明,这个类一定要保存接口的名称,我们可以通过一个string类型的变量保存该属性,有了类名称,我们接下俩要保存的就是该接口声明的方法,因为方法不止一个,因而我们需要一个Array类型来进行保存,因此我们有了:

var Interface = function(name, methods){
    var argLen = arguments.length;
    if(argLen != 2){
        throw new Error("Interface类的构造函数需要至少两个参数!");            
    }
    
    this.name = name;      //     用来保存接口名称
    this.methods = [];     //     用来保存要实现的方法名称
    
    var i = 0,
        methodLen = methods.length;
    for(; i<methodLen; i++){
        var method = methods[i];
        if(typeof method ){
            throw new Error("Interface类构造函数中的methods参数应该是string[]类型");
        }
        methods.push(method);
    }
}

//    接口声明方式
var Animal= new Interface('Animal', ['eat', 'sleep']);

这样我们就有了接口的声明类,接下来我们要做的就是接口的实现。

要做就是去验证一个类是否实现一个接口,我们可以在上面的Interface类中添加一个类方法,作为验证一个类是否实现一个接口,这个方法就需要传入参数接口名称和该实现类。

Interface.ensureImpelements = function(object){
	var len = arguments.length;
	if(len < 2){
	   throw new Error("方法Interface.ensureImplements需要至少两个参数!");		
	}

	var i = 1;
	for(; i<len; i++){
		var interface = arguments[i];
		if(interface.constructor  != Interface){
		   throw new Error("方法Interface.ensureImplements参数需要Interface的实例对象!");		}
		var	j = 0,	
			methodsLen = interface.methods.length;
		for(; j<methodsLen; j++){
			var method = interface.methods[j];
			if(!object[method] || typeof object[method] != "function"){
				throw new Error("方法Interface.ensureImplements : object 没有实现" + interface.name + " 接口. 方法" + method + " 没有被找到!");			
			}
		}
	}
}

// 定义Person类实现接口Animal接口中的方法
var Person = function(){};
Person.prototype = {
    eat : function(){...},
    sleep : function(){...}
}
//创建对象_person
var _person = new Person();
//  检验Person类的_person对象是否实现了Animal接口
Interface.ensureImpelements(_person, Animal);

这样我们就在js中基本上实现了接口的声明,和检测一个对象是否实现了该接口的方法。

注意:与java中不同的是,这里对于是否实现接口的检验只是针对实现类对象的检验,代码中传入的参数_person就是Animal接口的实现类Person的一个实例。

若要是改成为检测实现类是否实现了接口中声明的方法,代码如下:

Interface.ensureImpelements = function(object){
	var len = arguments.length;
	if(len < 2){
	   throw new Error("方法Interface.ensureImplements需要至少两个参数!");		
	}

	var i = 1;
	for(; i<len; i++){
		var interface = arguments[i];
		if(interface.constructor  != Interface){
		   throw new Error("方法Interface.ensureImplements参数需要Interface的实例对象!");		}
		var	j = 0,	
			methodsLen = interface.methods.length;
		for(; j<methodsLen; j++){
			var method = interface.methods[j];
			//    这里因为传入的object为类的定义,因此要判断其原型中的方法
			if(!object.prototype[method] || typeof object.prototype[method] != "function"){
				throw new Error("方法Interface.ensureImplements : object 没有实现" + interface.name + " 接口. 方法" + method + " 没有被找到!");			
			}
		}
	}
}

// 定义Person类实现接口Animal接口中的方法
var Person = function(){};
Person.prototype = {
    eat : function(){...},
    sleep : function(){...}
}

//  检验Person类的是否实现了Animal接口
Interface.ensureImpelements(Person, Animal);






转载于: