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

多态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 - 22 Java 多态

    Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态性是对象多种表现形式的体现. 比如我们说"宠物"这个对象,它就有很多不同的表达或实现,比如有小猫.小狗.蜥蜴 ...

  2. ThinkPHP5调用PHPExcel类实现导入导出

    注意:extend是放置第三方类的地方,不要乱配置命名空间那些,引起不必要的类错误 代码如下 <?php namespace app\index\controller; use think\Co ...

  3. Vbox共享文件夹不显示了

    博主之前装的虚拟机没啥问题,按部就班,打开“我的电脑”可以看到主机上的共享文件夹,最近重装了一波,各种问题就来了,包括共享文件夹设置好后,看不见了. 介绍比较麻烦的方案,就是打开“我的电脑”,在地址栏 ...

  4. oracle TDE

    转自:oracle TDE学习系列 (1) — wallet 使用管理 关于oracle wallet,通常称为oracle钱夹,说的通俗一点,oracle wallet是一个用 口令加密的PKCS# ...

  5. iPhone 获取指定格式的时间和日期

    1.  显示当前的年月日+时间 NSDate* date = [NSDate date]; NSDateFormatter* formatter = [[[NSDateFormatter alloc] ...

  6. c++ maps使用

    #include <iostream> #include <stdio.h> #include <memory.h> #include <queue> ...

  7. 37. sqlplus工具连接服务端或其他电脑的oracle方式

    1. 方式1:IP:监听端口/实例ID,例如:192.168.0.1:1521/orcl 2.方式2:IP:监听端口/服务名,例如:192.168.0.1:1521/ORCL.168.0.1 查看服务 ...

  8. Redis 主从复制, 读写分离

    1: 是什么? 2: 经常是配置从库, 不配置主库 3.1: 每次与 master 断开之后都要从连, 除非你配置了redis.conf 3.2: 获取当前redis 服务信息 => info ...

  9. 机器学习进阶-图像基本处理-视频的读取与处理 1.cv2.VideoCapture(视频的载入) 2.vc.isOpened(载入的视频是否可以打开) 3.vc.read(视频中一张图片的读取) 4.cv2.cvtColor(将图片转换为灰度图)

    1.vc = cv2.VideoCapture('test.mp4') #进行视频的载入 2.vc.isOpened() # 判断载入的视频是否可以打开 3.ret, frame = vc.read( ...

  10. flash builder的配色方案

    写代码的时候看着代码颜色不是特别好,于是研究了一下flash builder的配色方案. flash builder由eclipse开发,采用和eclipse相同的配置方法,这个网站上有很多配色模板: ...