专栏首页coding for loveJS进阶系列03-JS面向对象的三大特征之多态

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 条评论
登录 后参与评论

相关文章

  • JS进阶系列01-JS的弱类型和动态类型

    首先,我们要弄清楚编程语言的两组划分,即弱类型和强类型,动态类型和静态类型。下面有一幅图,非常详细地说明了它们各自的定义和区别。

    love丁酥酥
  • JS常用设计模式解析01-单例模式

    考虑实现如下功能,点击一个按钮后出现一个遮罩层。 原始办法:我们只需要实现一个创建遮罩层的函数并将其作为按钮点击的回调事件即可。如下:

    love丁酥酥
  • 进程与线程,单核与多核1. 简介2. 程序3. 进程4. 线程5. 多进程与多线程的选择6. 小结参考

    用户打开浏览器,其实就是打开了浏览器应用程序。那么什么是程序呢?我们常说浏览器是多线程的,JS 是单线程的,那么什么是线程呢?说到线程,和我们常说的进程有什么关...

    love丁酥酥
  • 一分钟学Python| Python的字符串类型

    之前我们学完了Python的简单语法,现在我们一起学习Python的一些数据类型。这里所说的类型不是变量的类型,变量是没有类型的,这个类型指的是变量内存中对象的...

    Python进击者
  • TensorFlow四种Cross Entropy算法的实现和应用

    用户1737318
  • man -f/-k [keyword]在fedora 29 中报错nothing appropriate

    我们在使用 man 手册的时候,可以使用man -f [keyword]去查询keyword的在线文档, 但是这时候会报错:(图来源自网络)

    xuyaowen
  • 电商+小程序实现线上线下无缝对接未来发展优势在哪里?

    从2017年1月9日至今,小程序上线已近两年。拥有10亿活跃用户微信,是移动互联网巨大的流量金矿,小程序的商业价值、用户价值、流量价值也无需在此多言。而在这60...

    速成应用小程序开发平台
  • lncRNAs和circRNAs数据分析,你需要这个神器

    Lnc2Cancer 3.0由哈尔滨医科大学李霞老师和宁尚伟老师课题组开发,发表在2020年10月13日发表在Nucleic Acids Research杂志上...

    百味科研芝士
  • 目前最强性能的人脸检测算法(Wider Face Dataset)

    《月令七十二候集解》:“二月中,分者半也,此当九十日之半,故谓之分。秋同义。”《春秋繁露·阴阳出入上下篇》说:“春分者,阴阳相半也,故昼夜均而寒暑平。”

    计算机视觉研究院
  • lncRNA必知必会的数据库资源大全

    让我很无语,我又不是带领本科生搞一个学期的课程,仅仅是不到2小时我能讲解什么背景呢:

    生信技能树

扫码关注云+社区

领取腾讯云代金券