我目前正在阅读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)
以及&&操作员如何在这种情况下工作以使其工作?
该&&操作并不总是返回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)
| 归档时间: |
|
| 查看次数: |
1694 次 |
| 最近记录: |