命令模式 JavaScript 中的执行函数

Execute function in command pattern JavaScript

本文关键字:执行 函数 模式 JavaScript 命令      更新时间:2023-09-26

我目前正在阅读Addy Osmani的JavaScript设计模式,可以在这里找到:http://addyosmani.com/resources/essentialjsdesignpatterns/book/。

我发现它非常愉快,非常有帮助。 我确实对书中的一种模式有疑问,即命令模式。

在书中,Addy 解释了命令模式有助于更好地分离对象和方法调用。

这是我对他的例子的版本:

var person = {
    sayName: function (name) {
        return "My name is " + name;
    },
    sayAge: function (age) {
        return "My age is " + age;
    },
    sayGender: function (gender) {
        return "My gender is " + gender;
    }
}
person.execute = function (name) {
    return person[name] && person[name].apply(person, [].slice.call(arguments, 1));
}
console.log(person.execute("sayName", "Sethen"));

魔术是在执行方法中完成的。 如您所见,您传递方法名称和参数,该方法负责其余的工作。

我的困惑源于execute方法实际上返回的内容。 当你看到它时,它看起来像是与&&短路,我一直认为由于JavaScript转换而返回了一个布尔值。

但是,如果您尝试使用代码,它完全可以正常工作,记录My name is Sethen

此外,我发现简单地使用return person[name].apply(person, [].slice.call(arguments, 1);会产生相同的结果,并且在我看来更容易阅读。

因此,我的问题是return在原始execute方法中如何工作:

return person[name] && person[name].apply(person, [].slice.call(arguments, 1));

以及在这种情况下&&运算符如何工作以使其工作?

&&运算符并不总是返回 boolean 。它返回它计算的最后一个子表达式的值。如果请求的方法名称存在,则该表达式将返回.apply()调用的结果。

所以:

return person[name] && person[name].apply(person, [].slice.call(arguments, 1));

方法:

if (!person[name])
  return person[name];
return person[name].apply(person, [].slice.call(arguments, 1));

在这种情况下,&&的行为有点像 if 语句。

如果您要传入不是该对象上的方法的东西,它将是假的,并且不会继续执行语句的其余部分。