鉴于我有这段代码:
if (_.isFunction(this.doSomething)) {
this.doSomething();
}
其中loadingComplete是从父控制器传入的指令属性,可能并不总是提供,如果存在,是否有更简洁的单行方式来调用方法,而不重复方法名称?
类似的东西:
_.call(this, 'doSomething');
答案 0 :(得分:24)
_.result(this, 'doSomething', 'defaultValueIfNotFunction')
答案 1 :(得分:6)
从版本4.0.0开始,lodash提供了一个名为invoke
的方法:https://lodash.com/docs/4.15.0#invoke
var object = {
add: function(a, b) { return a + b }
};
_.invoke(object, 'add', 1, 2);
// => 3
_.invoke(object, 'oops');
// => undefined
请注意,如果出于某种原因,其他与您提供的密钥上的某个功能相比,它仍然会爆炸。
答案 2 :(得分:4)
@stasovlas的答案是正确的方法。
你一直在寻找的机器人:
_.get(this, 'doSomething', _.noop)()
它相当自我记录,在功能上等同于:
if (this.doSomething) {
this.doSomething();
} else {
_.noop();
}
如果你想在你的代码库中重复使用它,你可以使用mixin使它更具可读性和简洁性,并将其烘焙到lodash中:
var runIfFunction = function(value) {
if (_.isFunction(value)) {
return value();
}
};
_.mixin({runIfFunction: runIfFunction});
允许您这样做:
_.runIfFunction(this.doSomething);
答案 3 :(得分:4)
较新的Javascript / Typescript版本本机支持
const result = someInterface.nullableMethod?.();
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
(有关本机浏览器的支持,请参见页面底部)
答案 4 :(得分:0)
这有点难看,但您可以使用result:
_.result({fn: this.doSomething}, 'fn');
答案 5 :(得分:0)
如果this.doSomething
是函数或未定义/假,则:
this.doSomething && this.doSomething();
是一种常用的模式。
答案 6 :(得分:-2)
if (_.isFunction(this.doSomething)) {
this.doSomething();
}
在一行中:
if (_.isFunction(this.doSomething)) this.doSomething();