js中接口的实现

看了《JavaScript设计模式》一书,其中对接口的使用进行了系列介绍,本文为自己总结的内容。

首先,为什么要使用接口?

举个栗子。

现在,我想要创建一个类,这个类的作用,是将传入的内容以另一种格式输出。

首先,我们看一看不使用接口的情况:

var ResultFormatter = function(resultsObject) {
            if (!(resultsObject instanceof TestResult)) {
                // 判断传入内容是否为TestResult类,若是,则继续执行。否则终止报错
                throw new Error("constructor requires an instance of TestResult as an argument");
            }
            this.resultObject = resultsObject;
        };
        ResultFormatter.prototype.renderResults= function() {
            var dateOfTest = this.resultsObject.getDate();
            var resultsArray = this.resultsObject.getResults();
            ......
        }

在上面的代码中,我们判断传入类的参数的类型,目的其实是判断传入内容是否具有getDate和getResults函数,这样在执行renderResults函数时,才不会发生错误。我们来看这样做的弊端:

  1. 是不是进行了类型的判断,就真的不会发生错误了呢?答案是否定的。如果TestResult类被人修改了代码,不再具有这两种方法了,这种判断就是毫无意义的。
  2. 是不是不是TestResult的参数,就一定不能使程序实现其预定功能呢?比如说,现在传入的参数属于TestResultDuplex类,该类同样具有上述所需的两种方法,那么事实上,程序仍然可以正常实现其功能,但是由于我们的类型判断,则进行了无谓的报错,使代码降低了灵活性

以上就是我理解的,不使用接口的弊端,也就是使用接口的原因。那么,接口实现的思路是什么?其实并没有固定的思路,因为js中并未定义接口这一内容,所有接口的实现机制,都是需要我们去自己编写的,在《JavaScript设计模式》中,其接口实现的思路是这样的:

  1. 定义一个接口:接口中声明实现该接口的类应该具备的方法
  2. 检验是否实现了接口:遍历类所具有的方法,判断其是否具备了接口声明的所有方法,是,则该类实现了接口,否,则该类未实现接口。

继续以上个功能举例,要通过实现接口的方法来改写上个功能的代码,我们要替换掉上面代码对类的判断语句。

    //定义接口
    myInterface = new Interface('myInterface', ['method1', 'method2']);
    //定义类
    var Test1 = function () { };
    Test1.prototype = {
        method1: function() {},
        method2: function() {}
    }
    //实例化类
    instance1 = new Test1();
    //检验实例是否实现了接口
    Interface.ensureImplements(instance1, myInterface);

当我们的实例满足了具有method1和method2的方法时,没有报错。

而若将method2方法的定义注释掉,即实例并未满足接口要求时,则会报错

大家看,是不是简单的多。其中Interface类,是需要你导入的一个Interface.js文件。为了方便,我直接在《JavaScript设计模式》上截图现成的了~ js中接口的实现_第1张图片





你可能感兴趣的:(js中接口的实现)