学JS的心路历程-JS支持面向对象?(二)
昨天讲了面向对象的继承,今天我们来谈谈多态和封装吧!
多态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支持面向对象?(二)的更多相关文章
- 学JS的心路历程-JS支持面向对象?(一)
昨天在看Prototype看到JS支持面向对象,被前辈问到说那什么是面向对象?JS是面向对象语言吗? 便开始了一连串艰辛爬文过程,今天就来看一下两者有什么差异吧(rgwyjc)! 首先面向对象有三大特 ...
- 学JS的心路历程-函式(二)arguments
参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...
- 学JS的心路历程 - JS应用
各家电商网站都推出了各种活动和现今优惠券,当时在逛PTT时看到了有篇文章,提供代码教大家用JS的方式抢票,看了一下后发现好像很多人好奇这是怎么做的,于是就想说想一篇文章来讲解一下. 我们先来看一下折价 ...
- 学JS的心路历程 - JS的Class
没错,你没有看错,虽然前面说JS是原型继承,但在ES6以后新增了class关键字!!! 不过底层实作仍然是以原型继承方式进行,所以基本上算是一个语法糖. 今天我们就来看一下如何使用吧! class 首 ...
- 学JS的心路历程-物件与原型(一)
前两天说明面向对象的三大特性及JS不符合面向对象,只能称作支持面向对象而已,今天我们来看看JS的原型继承. 首先我们先来看,什么是原型(vmwork): 两个物件之间的原型关系(prototype r ...
- 学JS的心路历程 -函式(三)this
this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...
- 学JS的心路历程Day26 - PixiJS -入坑
后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...
- 学JS的心路历程-物件与原型(三)
昨天有说明到函式与建构式的原型,及指定建构式函式原型为另一个建构式函式,但其实这会造成复写constructor的问题. 复写constructor的问题(vmwork) 我们昨天有提到「建构式函式可 ...
- 学JS的心路历程 -物件与原型(二)
昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...
随机推荐
- js中的substring
"ABCDEFG".substring(2,3) 结果为"C"
- 皮卡丘检测器-CNN目标检测入门教程
目标检测通俗的来说是为了找到图像或者视频里的所有目标物体.在下面这张图中,两狗一猫的位置,包括它们所属的类(狗/猫),需要被正确的检测到. 所以和图像分类不同的地方在于,目标检测需要找到尽量多的目标物 ...
- C#winform抓取百度,Google搜索关键词结果
基于网站seo,做了一采集百度和Google搜索关键字结果的采集.在这里与大家分享一下 先看先效果图 代码附加: 1 private void baidu_Click(object sender ...
- python函数的return
return语句用于退出函数,向调用方返回一个表达式.return在不带参数的情况下(或者没有写return语句),默认返回None.None是一个特殊的值,它的数据类型是NoneType.NoneT ...
- ajax事件执行顺序
1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success(请求成功时调用) 5.ajaxSuccess(全局事件) 6.error 7.aja ...
- System.Data.DbType映射关系
有如下类型的映射对照: System.Data.SqlClient.SqlDbType System.Data.OleDb.OleDbType System.Data.Odbc.OdbcType S ...
- vmware三种网络模式:桥接模式|仅主机|NAT模式
VMware 网络模式 1. Bridged(桥接)桥接模式下,宿主机物理网卡(主机网卡)和虚拟网卡通过 VMnet0 虚拟交换机进行桥接,物理网卡和虚拟网卡在拓扑图上处于同等地位,物理网卡和虚拟网卡 ...
- 56.纯 CSS 描述程序员的生活
原文地址:https://segmentfault.com/a/1190000015316996 感想:动画加延时,white-space: pre; 保留HTML p 中刻意留下的空白. HTML ...
- PropertiesUtils
package com.icil.elsa.subscribe.milestone.common.utils; import java.io.BufferedInputStream; import j ...
- JS获取QueryString(Jquery)
QueryString = { data: {}, Initial: function() { var aPairs, aTmp; var qu ...