我目前正在阅读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方法中完成。如您所见,您传递方法名称和参数,该方法负责其余的工作。
我的困惑源于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));
以及&&
运算符如何在此实例中工作以使其工作?
答案 0 :(得分:6)
&&
运算符并不总是返回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));
答案 1 :(得分:1)
在这种情况下,&&
的行为类似于if语句。
如果您传入的东西不是该对象的方法,那么它将是错误的,并且不会继续执行该语句的其余部分。