学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 ...
随机推荐
- 安全测试8_Web安全实战1(DVWA部署)
1.渗透神器的打造(火狐浏览器的打造) Firebug HackBar(渗透插件) Tamper Data(抓包.截包.改包等功能) Proxy Switcher(代理设置) 2.PHP环境安装(ph ...
- position:absolute溢出处理
今天在做布局的时候发现把table设置了position:absolute后 overflow居然不管用了,溢出的部分依然溢出. 百度后,才想起来... ... position后,元素已经和父元素不 ...
- Faster RCNN原理分析(二):Region Proposal Networks详解
Faster RCNN原理分析(二):Region Proposal Networks详解 http://lib.csdn.net/article/deeplearning/61641 0814: A ...
- 关于thinkphp5被入侵后的一些思考
最近一段时间thinkphp5爆出漏洞 request.php中的请求过滤不严 是得web端 可以直接写入一个文件到服务器上 进而可得webshell权限 我的一个客户 就是这样被入侵了 刚开始 ...
- py库: PIL 、pillow(图像处理)
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014320027235877 ...
- <转载>AWS 基础知识
什么是AWS? Amazon Web Services (AWS) , 其实就是 亚马逊提供的专业云计算服务.其提供服务包括:亚马逊弹性计算网云(Amazon EC2).亚马逊简单储存服务(Amazo ...
- canal 入门(基于docker)
第一步:安装MySQL:(可以参考:https://my.oschina.net/amhuman/blog/1941540) 命令: sudo docker run -it -d --restart ...
- 白鹭引擎 - 绘制圆形的进度条 ( graphics )
class Main extends egret.DisplayObjectContainer { /** * Main 类构造器, 初始化的时候自动执行, ( 子类的构造函数必须调用父类的构造函数 ...
- Mysql 视图使用
视图 简单理解视图就是一张虚拟表,可以简化一些复杂查询语句 举个简单的例子来理解视图 视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询:不包含任何列或数据.使用视图可以简化复杂 ...
- feedparser的安装
Python中常常要利用RSS下载文本.由于这个Python开源软件嘛,碎片化特别严重.反正是各种边边角角的小问题.网上找来找去找半天都没解决如何安装.我的是win7的.python 是3.4版本的. ...