给你稍稍改了下,减了一层循环,不过没有测试,你先看看

interface.checkImplement = function(object) {

// if (arguments.length < 2 || object.constructor !== Array) {

if (arguments.length < 2 || !Array.isArray(object)) {

throw "您并没有给指定的2个属性参数赋值,因此并不做接口规范检查";

}

interface.objects = object;

// var allInterfaceMethods = [].splice.call(arguments, 1).reduce(function(r, c) {

// return r.concat(c.method);

// }, []);

var allInterfaceMethods = [];

for (var i = 1; i < arguments.length; i++) {

// 连接数组,生成大数组

allInterfaceMethods = allInterfaceMethods.concat(arguments[i].method);

}

// 这里可以给 allInterfaceMethods 去重,不去重也不影响后面的逻辑

// interface.objects.forEach(function(obj) {

// allInterfaceMethods.forEach(function(method) {

// if (typeof obj[method] !== "function") {

// throw new Error("object类没有实现接口 抽象方法,或者值不是一个function");

// }

// });

// });

for (var i = 0; i < interface.objects.length; i++) {

var interobj = interface.objects[i];

// 上面那个忘了判断类型,这里加上

if (interobj.constrcutor !== interface) {

throw new Error("这个接口对象属性值必须是object并且constroctur必须是接口 类");

}

for (var j = 0; j < allInterfaceMethods.length; i++) {

var method = allInterfaceMethods[j];

if (typeof interobj[method] !== "function") {

throw new Error("object类没有实现接口 抽象方法,或者值不是一个function");

}

}

}

};

总的来说,就是先把所的接口的方法都找出来,放在一个大数组里,去重(不去重也无所谓)。然后再遍历每个对象看是否实现了这些方法,就这里减少了一层 for。

判断类型的时候不需要先判是否存在,直接用 typeof 就可以了,因为对不存在的属性进行 typeof 去处会得到 "undefined",肯定不是 "function"。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐