You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functionmixin(sourceObj,targetObj){for(varkeyinsourceObj){// 只会在不存在的情况下复制if(!(keyintargetObj)){targetObj[key]=sourceObj[key];}}returntargetObj;}varVehicle={engines: 1,ignition: function(){console.log("Turning on my engine.");},drive: function(){this.ignition();console.log("Steering and moving forward!");}};varCar=mixin(Vehicle,{wheels: 4,drive: function(){Vehicle.drive.call(this);console.log("Rolling on all "+this.wheels+" wheels!");}});Vehicle.drive();// Turning on my engine.// Steering and moving forward!Car.drive();// Turning on my engine.// Steering and moving forward! // Rolling on all 4 wheels!
JavaScript中的多态
开始初学JavaScript时,听说JavaScript没有多态,我就天真的以为JavaScript真的没有。那么,JavaScript真的没有多态吗?
多态是什么
听起来是不是像是
if else
或者switch case
?对,使用多态可以取代这些过程化的条件语句,使代码间解耦。
之前面试被问过哪些方法可以使一个函数有多种执行结果,只回答出了条件语句,现在想想,如果当时了解了多态,应该可以加一点分把。
多态的体现1
有这样一段代码:
上面的代码,如果我们想添加第三种播放器—酷狗音乐,就需要再改写putOnsomeMusic,判断是酷狗的话,执行酷狗的播放。
这种改动是有一定的风险的,我们应该遵循开闭原则:对扩展是开放的,对修改是关闭的。
我们找出代码中的多态性,尝试改写一下上面的代码:
现在,如果再加其他的播放器,我们只需要定义好,然后把参数传进去。(假设所有播放器都是play()方法来播放)
做到多态,我们就需要把代码抽象,分离,解耦。把“做什么”和“谁去做”,分离开。
多态的体现2:重写
这里直接复制了《你不知道的JavaScript》里的例子
可以看出来,在Car中,我们重写了Vehicle的方法。
总结
开始看到这两种都是多态的时候,我是有些懵逼的。后来想了想,也没什么不对。
不管是抽象,还是重写,都是为了让一段代码,有了不同的表现形式。可以做出不同的事儿。
参考文章:
The text was updated successfully, but these errors were encountered: