JavaScript多态

"多态"的字面意思就是"多种状态",在OOP中意味着我们的代码可能要面临着多个分支。在日常编写Javascript时,我们也许会写出这样的条件选择语句:假设这里有两位赛跑选手runner1和runner2,我们要查看他们各自的跑步速度

var runner1 = new Object(); runner1.speed = 80; var runner2 = new Object(); runner2.speed = 100; function getSpeed(name){ if(name==='runner1') console.log(runner1.speed); if(name==='runner2') console.log(runner2.speed); } getSpeed('runner1');//80 getSpeed('runner2');//100

上面的语句就是多态的一种表现,但它仅仅代表了“多种状态”的意思,并没有把OOP中多态的关键体现出来。我们可以看到 if...else 判断分支语句,它把runner1和runner2分离开来,但这是很脆弱的。一旦我们要增加赛跑选手,那么,我们就必须创建一个新的runner3对象,设置他的速度属性value,并且而又最关键的是,我们必须把getSpeed函数内部添加分支语句,这就意味着getSpeed函数也需要进行更多的判断,运行成本增加。

多态背后的思想是将“做什么”和“谁去做以及怎样去做”分离开来,也就是将“不变的事物”与 “可能改变的事物”分离开来。——《JavaScript设计模式与开发实践》

“多态”实际上是要把代码分离,是殊途同归,在尽力避免条件选择语句下,使得同一个操作函数(不变的部分)能够对不同的对象(会变的部分)执行同一个操作行为,并根据对象的不同,得出各自的结果。下面我们尝试建立赛跑选手(runner)的多态性,并消除选择分支语句。

var runner = new Function(); runner.prototype.speed = 0; var runner1 = new runner(); runner1.speed = 80; var runner2 = new runner(); runner2.speed = 120; function getSpeed(obj){ console.log(obj.speed); } getSpeed(runner1);// 80 getSpeed(runner2);// 120

可以看见,操作函数getSpeed非常简洁,内部并没有出现条件选择语句。如果我们要增加一个runner3,只需要创建一个runner的实例,并设置他的speed。(注意,这里把runner也分离开来,因为runner1,runner2...等等都是runner,这样以后我们要增加全体操作也会方便很多)。符合多态的代码具有生命力和拓展性,对于项目来说是有利的。

换句话说,多态最根本的作用就是通过把过程化的条件分支语句转化为对象的多态性。——《JavaScript设计模式与开发实践》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 封装性:类型于其它的面向对象语言一样,用大括号来限定变量的作用域。这样就有了局部变量。如果声明在最外面,那就是全局...
    Bigbang_boy阅读 456评论 0 0
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,321评论 1 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,727评论 19 139
  • 《JavaScript设计模式与开发实践》作者:曾探 系统的介绍了各种模式,以及js中的实现、应用,以及超大量高质...
    undefinedR阅读 897评论 0 10
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,900评论 18 399

友情链接更多精彩内容