//声明接口类,用于实例化接口
function Interface(name,methods) {
this.name = name;
let functions = [];
//方法名为字符串类型
methods.forEach(method=>{
if(typeof method !== "string"){
throw new Error(`illegal arguments: '${method}'` );
}
functions.push(method);
});
this.methods = functions;
}
//实例化接口
const CompositeInterface = new Interface("Composite",["addComposite"]);
const FormInterface = new Interface("Form",["addForm"]);
//声明规则检测制定类是否实现了指定接口
function ensureInterFace(obj,interfaces) {
//参数少于两个校验失败
if(arguments.length <2){
throw new Error("illegal arguments number");
}
//第2至N个参数为接口
for(let i = 1;i<arguments.length;i++){
let inf = arguments[i];
if(inf.constructor !== Interface){
throw new Error(`illegal arguments type.'${inf}' must be a interface`);
}
//遍历接口的每个method是否被实现
let methods = inf.methods;
methods.forEach(method =>{
if(!obj[method] || typeof obj[method] !== "function"){
throw new Error(`method '${method}' must be implemented`);
}
})
}
}
function CompositeForm() {
}
CompositeForm.prototype.addComposite = function () {
console.log("addComposite");
};
CompositeForm.prototype.addForm = function () {
console.log("addForm");
};
let compositeForm = new CompositeForm();
ensureInterFace(compositeForm,CompositeInterface,FormInterface);
//test
compositeForm.addComposite();