JS进阶系列03-JS面向对象的三大特征之多态

1. 多态的定义

多态是同一个行为具有多个不同表现形式或形态的能力。在JAVA中,多态通过在子类中重写父类方法去实现。但是在JS中,由于JS本身是动态的,天生就支持多态。大家可以通过几个例子来理解一下。

2. 多态的实现

举个例子吧,国王听腻了只有鸭子为他唱歌,他决定搞一个动物合唱团。所以,大臣们搜罗了鸭,鸡,狗等动物,而且还设置了专门的选拔官员测试,选拔官员一声令下:‘唱’,面前的动物就发出了特有的叫声,鸭子嘎嘎嘎,小鸡咯咯咯,小狗汪汪汪......要实现这个功能,我们可以使用如下代码:

var singStart(animal){
    if (animal instanceof Duck) {
        console.log('嘎嘎嘎');
    } else if (animal instanceof Chicken) {
        console.log('咯咯咯');
    }
function Duck(){}
function Chicken(){}
singStart(new Duck());  // 嘎嘎嘎
singStart(new Chicken());  // 咯咯咯
}

这种方法当然也可以实现多态,但是却违反了封装性,我们将可变的动物类型与不可变的唱歌指令耦合到了一起。如果动物类型增加,我们必须在开始唱歌方法中新增判断分支。这就好比是选拔官员发出的指令是这样的:“你是鸭子的话,唱嘎嘎嘎,是鸡的话,唱咯咯咯,是狗的话,唱汪汪汪......”这明显是不合理的。真实的情况应该是,选拔官员发出简短清晰的指令“唱”时,每种动物会场出自己独有的声音。 让我们用面向对象的思想去考虑,将不变的指令隔离开来,将可变的具体实现封装起来。JAVA会使用类继承和重写的方式来实现,如下:

abstract class Animal {  
    abstract void sing();  
}  
  
class Duck extends Animal {  
    public void sing() {  
        System.out.println("嘎嘎嘎");  
    }  
}  
  
class Chicken extends Animal {  
    public void sing() {  
        System.out.println("咯咯咯");  
    }  
} 
public class Test {
    public static void main(String[] args) {
        Animal duck = new Duck();
        Animal chicken = new Chicken();
        singStart(duck);  // 嘎嘎嘎
        singStart(chicken);  // 咯咯咯
  }  
            
public static void singStart(Animal a)  {
      a.sing();
}

而对于JS来讲,我们为具体的动物类型的原型定义具体的sing方法即可,如下:

function Duck(){}
Duck.prototype.sing = function(){
    console.log('嘎嘎嘎');
}
function Chicken(){}
Chicken.protorype.sing = function(){
    console.log(‘咯咯咯’);
}
function singStart(animal){
    animal.sing();
}
singStart(new Duck());  // 嘎嘎嘎
singStart(new Chicken());  // 咯咯咯

而且,更棒的是,JS是动态的,这里并不限制传入的参数类型是animal。大家可以看到,我们在代码中,也没有实现Animal这个类型,事实上,我们可以传入任意类型的对象,只要它正确包含一个sing方法即可。如下:

function Person(){}
Person.protorype.sing = function(){
    console.log(‘哈哈哈’);
}
singStart(new Person());  // 哈哈哈

可以看出来,在JS中实现多态更加方便,且更加强大。

参考

BOOK-《JavaScript设计模式与开发实践》 第一部分 Javascript基于对象三大特征 【原生js】js面向对象三大特征之多态笔记 JAVA多态

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

第十四天 面向对象-eclipse导jar包&修饰符&自定义数据类型【悟空教程】

Ctrl+滑鼠左键 或者 F3 查看所选中类的源代码,当选中一个方法查看源代码时,会出现以下显示,上边为方法声明的位置,下边为方法实现的位置。

10320
来自专栏JackieZheng

初探JavaScript(四)——作用域链和声明提前

前言:最近恰逢毕业季,千千万万的学生党开始步入社会,告别象牙塔似的学校生活。往往在人生的各个拐点的时候,情感丰富,感触颇深,各种对过去的美好的总结,对未来的展望...

20650
来自专栏小詹同学

Leetcode打卡 | No.013 罗马数字转整数

欢迎和小詹一起定期刷leetcode,每周一和周五更新一题,每一题都吃透,欢迎一题多解,寻找最优解!这个记录帖哪怕只有一个读者,小詹也会坚持刷下去的!

17640
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-day11-接口;多态案例练习

Java基础-day11-接口&多态案例练习 题目要求1(多态): 定义家类 方法:饲养动物 动物类: 属性:年龄、姓名 方法:吃饭、睡觉 猫类、狗类、猪类均为...

42140
来自专栏数据结构与算法

P1077 摆花

题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多...

34280
来自专栏Python

面向对象的三大特性(封装、继承、多态)

继承 什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 python中类...

1.9K90
来自专栏zaking's

js算法初窥04(算法模式01-递归)

13720
来自专栏HTML5学堂

JavaScript实现十进制转换成二进制

HTML5学堂:平时大家在写JavaScript效果的时候,可能会比较少接触二进制、八进制,经常使用的是十进制。计算机中的二进制则是一个非常微小的开关,用“开”...

34580
来自专栏WindCoder

Java设计模式学习笔记—抽象工厂模式

文章最后“Java设计模式笔记示例代码整合”为本系列代码整合,所有代码均为个人手打并运行测试,不定期更新。本节内容位于其AbstractFactory包(pac...

9610
来自专栏数据结构与算法

43:相关月

43:相关月 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB描述 “相关月”是指那些在一年中月份的第一天星期数相同的月份。例如...

36960

扫码关注云+社区

领取腾讯云代金券