有没有办法缩短这种连锁电话?
if (obj && obj.prop && obj.prop.subProp1 && obj.prop.subProp1.subPropFunc) {
obj.prop.subProp1.subPropFunc();
}
我能想到的唯一选择是try-catch.还有其他想法吗?
*我真的厌倦了写这些.在coffeescript使用它会更容易吗?
解决方法:
这应该适用于您的示例代码(未测试“所有案例”,只是您的样本的副本):
function propsExist(obj) {
if (!obj) return false;
for (var i = 1; i < arguments.length; i++) {
if (!obj[arguments[i]]) return false;
obj = obj[arguments[i]];
}
return true;
}
if (propsExist(obj, "prop", "subProp1", "subPropFunc")) {
obj.prop.subProp1.subPropFunc();
}
方法propsExist()接受可变数量的参数,第一个参数是您要检查属性/函数的原始对象.它将遍历您发送给它的属性列表并按顺序检查它们.如果不存在,则返回false.如果它通过整个循环,它成功验证!
如果你总是想调用子属性的函数,如果它验证了,你也可以只更改propsExist函数来调用它而不是返回true(然后将函数重命名为callIfValid(obj,…)