昨天讲了面向对象的继承,今天我们来谈谈多态和封装吧!

多态polymorphism

抽象讲法解释,就是使用单一界面操作多种型态的物件

继承父类别,定义与父类别中相同的方法,但实作内容不同,称为复写(override)。

我们昨天已经确定了JS是用原型继承的方式实作面向对象继承的抽象概念。

上面我们也有说明了多态的定义,那要JS要怎么实作呢(gzanqifood)?

假设今天我们要创立一个角色,有魔法师和剑士两种职业,所以我们会把一些角色的基本设定写在父类别,角色的差异则会在子类别设定。

function Role(name,blood){

this.name = name ||“”;

this.blood = blood ||“”;

}

function SwordMan(name,blood){

Role.call(this,name,blood);

this.fight =“挥剑攻击”;

}

function Magician(name,blood){

Role.call(this,name,blood);

this.fight =“火球术!”;

this.cure =“治疗!”

}

SwordMan.prototype = new Role();

Magician.prototype = new Role();

var sword = new SwordMan(“剑士”,200);

var magic = new SwordMan(“魔法师”,100);

可以看到说,虽然sword与magic都有name与blood,但会发现显示出来的不一样,这是因为我们继承了Role所以在复写时候才能显示不一样,而不是只会统一显示。

所以可以这样说,JS透过「原型继承」的方式达成多态的override实作。

如果我们用类别继承来实作的话。

public class Role{

privite String name;

privite int blood;

public int getBlood(){

return blood;

}

public String getName(){

return name;

}

}

public class Magician extends Role{

public void fight(){

System.out.println(“火球术!”);

}

public void cure(){

System.out.println(“治疗!”);

}

}

public class SwordMan extends Role{

public void fight(){

System.out.println(“挥剑攻击!”);

}

}

封装

封装的目的是要隐藏实作的细节,只让抽象的界面暴露出来,使用者只需要知道界面就好。

举个例子来说,我们在利用时间方法Date()时候,我们不需要知道他是怎么实作的,只需要知道使用它可以得到一个时间的字串值。

但是JS本身并没有提供像JAVA语言的privite私有成员的方法,只能利用「闭包」来达到类似封装的概念。想知道闭包的话可以回去看DAY19喔!

所以严格来说,JS不是面向对象的语言!

今天就到这边,明天会带各位一步一步了解原型继承,一样如果有未附上来源及错误欢迎留言指正(ruisente)!

学JS的心路历程-JS支持面向对象?(二)的更多相关文章

  1. 学JS的心路历程-JS支持面向对象?(一)

    昨天在看Prototype看到JS支持面向对象,被前辈问到说那什么是面向对象?JS是面向对象语言吗? 便开始了一连串艰辛爬文过程,今天就来看一下两者有什么差异吧(rgwyjc)! 首先面向对象有三大特 ...

  2. 学JS的心路历程-函式(二)arguments

    参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...

  3. 学JS的心路历程 - JS应用

    各家电商网站都推出了各种活动和现今优惠券,当时在逛PTT时看到了有篇文章,提供代码教大家用JS的方式抢票,看了一下后发现好像很多人好奇这是怎么做的,于是就想说想一篇文章来讲解一下. 我们先来看一下折价 ...

  4. 学JS的心路历程 - JS的Class

    没错,你没有看错,虽然前面说JS是原型继承,但在ES6以后新增了class关键字!!! 不过底层实作仍然是以原型继承方式进行,所以基本上算是一个语法糖. 今天我们就来看一下如何使用吧! class 首 ...

  5. 学JS的心路历程-物件与原型(一)

    前两天说明面向对象的三大特性及JS不符合面向对象,只能称作支持面向对象而已,今天我们来看看JS的原型继承. 首先我们先来看,什么是原型(vmwork): 两个物件之间的原型关系(prototype r ...

  6. 学JS的心路历程 -函式(三)this

    this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...

  7. 学JS的心路历程Day26 - PixiJS -入坑

    后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...

  8. 学JS的心路历程-物件与原型(三)

    昨天有说明到函式与建构式的原型,及指定建构式函式原型为另一个建构式函式,但其实这会造成复写constructor的问题. 复写constructor的问题(vmwork) 我们昨天有提到「建构式函式可 ...

  9. 学JS的心路历程 -物件与原型(二)

    昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...

随机推荐

  1. Java动手及实验整理

    1   枚举类型 在Java中,枚举类型本质上其实就是一个类,枚举中的常量都是该枚举类型的实例.枚举类型是引用类型!枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象.相同的值则引用同一个对象 ...

  2. CF865D Buy Low Sell High

    /* 贪心来选择, 如果能找到比当前小的, 就用最小的来更新当前的 优先队列即可 */ #include<cstdio> #include<algorithm> #includ ...

  3. is 和 == 区别,id() ,回顾编码,encode(),decode()

    1. is 和 == 区别 id()函数 == 判断两边的值 is 判断内存地址例 s = "alex 是 大 xx"# abc = id(s) # 得到内存地址# print(a ...

  4. suricata 关键字补充说明

    基本关键字 1.msg(对匹配到的规则的说明,第一部分约定用大写字母表示,msg始终是签名的第一个关键字) 注意:msg中必须转义以下字符: ; \ " msg :“ATTACK-RESPO ...

  5. HDFS 异构储存配置及基本命令操作

    hadoop-2.8.4 部署我就不说了 网上一大堆 hdfs-site.xml datanode 储存路径挂载需要修改如下: <property> <name>dfs.dat ...

  6. JavaScript 函数与对象的 简单区别

    直接上例子 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <met ...

  7. 5. MYSQL问题:Access denied for user 'root'@'localhost' (using password:YES)

    开发Web项目时,连接MYSQL数据库,出现问题:Access denied for user 'root'@'localhost' (using password:YES).       解决方案: ...

  8. ubuntu下如何配置terminator(以16.04为例)(转载)

    https://blog.csdn.net/xungjhj/article/details/69377812 Terminator 常用快捷键 命令 说明 Ctrl+Shift+O 水平分割窗口 Ct ...

  9. tomcat jvm 内存调优 适用于 JDK 6 & 7

    参考:https://blog.csdn.net/m0_37327416/article/details/76185051 1.jvm内存管理机制: 1)堆(Heap)和非堆(Non-heap)内存 ...

  10. docker 2 容器数据卷

    docker 启动tomcat docker run -it -p 8888:8080 tomcat 提交一个容器使之成为一个镜像 docker commit -a=“作者” -m=“提交信息” 模板 ...