首页 > js模拟接口问题求助

js模拟接口问题求助

/**
     * 创建接口对象
     * @param name 接口名 
     * @param methods 接口方法
     */
    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('方法名参数必须为string');
            }
            this.methods.push(methods[i]);
        }
    };
    /**
     * 接口实现
     * @param  object1 实现接口对象
     * @param  object2 对应接口
     * @return 实现错误抛出异常
     */
    Interface.ensureImplements = function(object){
        if(arguments.length < 2){
            throw new Error('必须输入两个参数,当前个数' + arguments.length);
        }
        for(var i=1, len=arguments.length; i < len; i++){
            var interface = arguments[i];
            if(interface.constructor != Interface){
                throw new Error("请实现接口");
            }

            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("接口名:"+interface.name+"方法名:"+method+"没找到");
                }
            };
        }
    }


    var DynamicMap = new Interface('DynamicMap',['centerOnPoint','zoom','draw']);

    /**
     * 执行方法
     * @param  函数方法
     * @return 执行结果
     */
    function displayRoute(mapInstance){
        Interface.ensureImplements(mapInstance,DynamicMap);//实现接口

        /**
         * 调用
         */
        mapInstance.centerOnPoint(12,34);
        mapInstance.zoom(5);
        mapInstance.draw();
    }
    /**
     * 函数方法
     * @type 实现接口方法
     */
    var a={
        centerOnPoint:function(x,y){
            console.log(x*y);
        },
        zoom:function(x){
            console.log(x);
        },
        draw:function(){
            console.log("x*y");
        }
    }
    displayRoute(a);



这句 Interface.ensureImplements 中interface是哪里的啊? 为什么不把这个写在上面那个interface里 Interface.ensureImplements = function(object) 这里的参数是object是什么意思啊 这个特别不能理解 求指点

interface 是從 arguments 中取得的,而 arguments 則是 javascript 內建一特殊屬性,可以取得當前函數接受到的參數,形式類似於數組。

那從上面代碼來講:

Interface.ensureImplements = function(object){
    if(arguments.length < 2){
        throw new Error('必须输入两个参数,当前个数' + arguments.length);
    }
    // 取得當前參數
    // 注意,這邊 i 從 1 開始,所以會跳過 object 取得後面其他參數
    // 參數是哪些?
    // Interface.ensureImplements(mapInstance,DynamicMap)
    // 這邊的 mapInstance 對應到 object,而 DynamicMap 就是 arguments[1]
    
    for(var i=1, len=arguments.length; i < len; i++){
        var interface = arguments[i];
        
        // 這邊會檢查傳進來的參數是否為 Interface 類型
        if(interface.constructor != Interface){
            throw new Error("请实现接口");
        }
        
        // 這邊會檢查其中的 methods 中的每個值是否都有在 object 中實踐
        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("接口名:"+interface.name+"方法名:"+method+"没找到");
            }
        };
    }
}
【热门文章】
【热门文章】