在命令模式JavaScript中执行函数

Set*_*hen 4 javascript

我目前正在阅读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"));
Run Code Online (Sandbox Code Playgroud)

魔术是在execute方法中完成的.如您所见,您传递方法名称和参数,该方法负责其余部分.

我的困惑源于该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));
Run Code Online (Sandbox Code Playgroud)

以及&&操作员如何在这种情况下工作以使其工作?

Poi*_*nty 6

&&操作并不总是返回boolean.它返回它评估的最后一个子表达式的值.如果请求的方法名称存在,那么该表达式将返回.apply()调用的结果.

所以:

return person[name] && person[name].apply(person, [].slice.call(arguments, 1));
Run Code Online (Sandbox Code Playgroud)

手段:

if (!person[name])
  return person[name];

return person[name].apply(person, [].slice.call(arguments, 1));
Run Code Online (Sandbox Code Playgroud)

  • @aaronman在我看来,`&&`和`||`的行为是该语言中最聪明的设计决策:)它们比(例如)Java版本更有用. (3认同)