命令模式教程代码疑问:return与&&用法及参数传递解析
拆解命令模式里的这段代码逻辑
嘿,我来帮你一步步搞懂这段代码的含义,以及你困惑的点~
核心代码解析:return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) );
我们把这句话拆成几个部分来看:
carManager[name]:先检查carManager对象中是否存在名为name的方法(比如你提到的buyVehicle)。如果存在,这个表达式会返回对应的函数;如果不存在,就返回undefined。&&短路逻辑:这是JavaScript里的短路求值——如果左边的carManager[name]是假值(比如undefined),就直接返回这个假值,不会执行后面的代码,避免了调用不存在的函数导致报错;如果左边是有效值(存在对应的方法),就继续执行右边的apply调用。carManager[name].apply( carManager, [].slice.call(arguments, 1) ):apply的作用是绑定函数的this指向,这里把this绑定到carManager,确保目标方法(比如requestInfo、buyVehicle)内部的this能正确访问carManager的其他属性或方法。[].slice.call(arguments, 1):arguments是函数的参数类数组(比如调用execute("buyVehicle", "Ford Escort", "453543")时,arguments就是["buyVehicle", "Ford Escort", "453543"])。slice.call的作用是把这个类数组转换成真正的数组,并且从索引1开始截取——也就是去掉第一个参数(方法名name),剩下的就是要传给目标方法的参数。比如上面的例子,截取后得到["Ford Escort", "453543"],会作为参数传给buyVehicle方法。
关于carManager["buyVehicle", "Ford Escort", "453543"]的误解
首先要明确:这种写法不是正确的调用方式,你可能混淆了命令模式的执行逻辑。
JavaScript里的对象属性访问器[]中,如果写多个用逗号分隔的值,这是逗号表达式——逗号表达式会依次计算每个值,最后返回最后一个值。所以carManager["buyVehicle", "Ford Escort", "453543"]实际上等价于carManager["453543"],这显然不是你想要的调用buyVehicle方法并传参的效果。
正确的做法是通过execute方法来调用:carManager.execute("buyVehicle", "Ford Escort", "453543"),execute方法会帮你把后面的参数提取出来,正确传递给对应的方法。
举个完整的示例,结合你给出的requestInfo方法:
(function(){ var carManager = { // request information requestInfo: function( model, id ){ return "The information for " + model + " (ID: " + id + ") is ready."; }, // 执行方法 execute: function(name) { return carManager[name] && carManager[name].apply( carManager, [].slice.call(arguments, 1) ); } }; // 调用示例 console.log(carManager.execute("requestInfo", "Ford Escort", 453543)); // 输出:The information for Ford Escort (ID: 453543) is ready. })();
内容的提问来源于stack exchange,提问作者weijia_yu
相关产品推荐
相关产品推荐

