javascript 多态
如果你在搜索引擎中搜索javascript多态,有那么一个栗子你一定会搜到
非多态代码示例
多态的代码示例
这个栗子出自《JavaScript设计模式与开发实践》,我手里没有这本书,但是不耽误我们去研究,这个栗子不太好扩展,我们继续看郭靖和黄蓉的栗子
我们分析一下代码
郭靖(Gj)和黄蓉(Hr)都有自己的属性和方法,而且不一定是一一对应关系,(郭靖有的属性和方法,黄蓉不一定有,反之亦然,具体参见代码)
郭靖有name,favourite,skill,sex属性和在原型链上添加了doSth方法
黄蓉有name,like,skill属性和在原型链是上添加了doSth方法
脑洞一下这个场景
洪七公站在郭靖和黄蓉的面前,发号施令:“练功”,然后郭靖和黄蓉分别执行自己的doSth方法,进行练功,而且每个人修炼的武功不一样
因为郭靖和黄蓉都可以练功都有doSth方法,所以我们将这个方法抽离出来进行封装,这么做有什么好处呢?
如果我们不这么做,就得进行条件判断,类似于if else,如果是黄蓉就执行黄蓉的doSth,如果是郭靖就执行郭靖的doSth,如果再来一个人,还要继续判断,
当人数越来越多的时候,判断就会越来越多,如果把丐帮弟子都拉过来练功,想想会怎么样呢?
多态背后的思想是将“做什么”和“谁去做以及怎样去做”分离开来,也就是将“不变的事物”与“可能改变的事物”分离开来。
在这个栗子中,郭靖和黄蓉都会练功(都存在doSth),这是不变的,但是他们所修炼的武功是不同的,所具备的属性也不是完全相同的。把不变的部分隔离出来,把可变的部分封装起来,这给予了我们扩展程序的能力,程序看起来是可生长的,也是符合开放—封闭原则的,相对于修改代码来说,仅仅增加代码就能完成同样的功能,这显然优雅和安全得多。
这里有一个问题,如果新来的人没有doSth方法怎么办呢?
所以,我们需要添加一个判断
instanceof ???
instanceof用于判断一个变量是否某个对象的实例
可以这么理解,上面的例子中hero.doSth是不是一个函数方法,如果是就执行
Martin Fowler 在《重构:改善既有代码的设计》里写到:
在电影的拍摄现场,当导演喊出“action”时,主角开始背台词,照明师负责打灯光,后面的群众演员假装中枪倒地,道具师往镜头里撒上雪花。在得到同一个消息时,每个对象都知道自己应该做什么。如果不利用对象的多态性,而是用面向过程的方式来编写这一段代码,那么相当于在电影开始拍摄之后,导演每次都要走到每个人的面前,确认它们的职业分工(类型),然后告诉他们要做什么。如果映射到程序中,那么程序中将充斥着条件分支语句。
利用对象的多态性,导演在发布消息时,就不必考虑各个对象接到消息后应该做什么。对象应该做什么并不是临时决定的,而是已经事先约定和排练完毕的。每个对象应该做什么,已经成为了该对象的一个方法,被安装在对象的内部,每个对象负责它们自己的行为。所以这些对象可以根据同一个消息,有条不紊地分别进行各自的工作。
将行为分布在各个对象中,并让这些对象各自负责自己的行为,这正是面向对象设计的优点。
多态增加了代码的可扩展性,降低了代码维护成本