JavaScript中并没有内置的创建或实现接口的方法。这里将利用JavaScript的灵活性,来实现与接口意义相同的功能。
接口的好处:
面向对象的JavaScript中接口的作用:
JavaScript中接口的弊端:
/*
interface Composite {
function add(child);
function remove(child);
function getChild(index);
}
*/
使用注释来描述接口,很难对接口的实例进行控制。
使用特定的方法来对特定的对象进行检查,看其是否实现了一组对应的方法,从而判断是否符合接口的要求。
使用属性模仿接口,主要是在实例声明的地方使用一个数组对象作为实现的接口的描述。然后在使用这个实例的时候,再使用一个存储接口名称的数组对象对其进行一个检查,看是否实现了相应的接口。
这里要注意的是,implementsInterfaces是一个接口保称的数组,arguments的遍历是从1开始,而不是从0开始,因为arguments[0]是传入的待判断对象。
function implements(object) {
for (var i = 1; i < arguments.length; i++) {
var interfaceName = arguments[i];
var interfaceFound = false;
for (var j = 0; j < object.implementsInterfaces.length; j++) {
if (object.implementsInterfaces[j] == interfaceName) {
interfaceFound = true;
break;
}
}
if (!intefaceFound) {
return false;
}
}
return true;
}
var CompositeForm = function(id, method, action) {
this.implementsInterfaces = [‘Composite‘];
// ...
};
function addForm(formInstance){
if(implements(formInstance,‘composite‘)){
throw new Error(Object does not implement a required interface.);
}
// ...
}
这种方法,对类所实现的接口提供了文档说明,如果实例没有实现接口,就会得到一个错误。
但是,这种方法从根本上说,并未确保类真正实现了自称实现的接口。
像鸭子一样走路并且嘎嘎叫的就是鸭子。
主要观点:如果对象具有与接口定义的方法同名的所有方法,那么就可以认为它实现了这个接口。
使用这种方法需要一个辅助函数来对实现接口的方法进行判断,看某个对象是否实现了某个接口。
我们可以使用一个辅助类Interface及其类方法Interface.ensureImplements来对对象实现的方法进行显式检查。
var Interface = function(name, methods) {
if (arguments.length != 2) {
throw new Error("Interface constructor called with " + arguments.length +
"arguments, but excepted exactly 2.");
}
this.name = 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 as a string.");
}
this.methods.push(methods[i]);
}
};
Interface.ensureImplements = function(object) {
if (arguments.length < 2) {
throw new Error("Function Interface.ensureImplements expects " +
"arguments two and above to be instances 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: object does not implement the " +
interface.name + "interface. Method" + method + "was not found.");
}
}
}
在使用这种方法的时候,我们可以使用Interface作为类型,然后将接口名称以及接口的方法以参数列表的形势传入。然后再在调用这个接口的实例的时候,调用ensureImplements方法进行判断是否实现了这一个接口。
这里我们使用typeof object[method] !== ‘function‘
检查对象是否包含某个方法。
var ResultSet = new Interface(‘ResultSet‘,[‘getDate‘,‘getResults‘]);
var ResultFormatter = function(resultsObject){
Interface.ensureImplements(resultsObject, ResultSet);
this.resultsObject = resultsObject;
};
ResultFormatter.prototype.rederResults = function(){
// ...
};
原文:http://www.cnblogs.com/sitemanager/p/3535176.html