/**
* 创建接口对象
* @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+"没找到");
}
};
}
}