ES6——简单的多态
简单的多态
多态:
1.同一个接口,在不同情况下做不一样的事情;相同的接口,不同的表现;
2.接口本身只是一组定义,实现都是子类里面;需要子类去实现的方法(子类只需重写与父类同名的方法,即可达到覆盖的效果),若子类有跟父类同名的方法,则会直接走子类的方法,不会走父类的;
3.非静态方法中,仍然子类可通过super..方法名( )(举例:super.say( ) ),来调用父类的方法(supe指向的事父类的原型) 重载:根据函数的参数类型,参数个数
作用:为一个函数提供了更丰富的行为
js的重载和其他语言的重载是完全不一样的概念。因为js是一门弱类型语言, JS中函数可以传入任意类型、任意个数的参数,通通可以通过在函数内使用this.arguments获得。这样,就无法实现同名函数参数列表不同实现不同功能。 而且js不是一个面向对象的语言, 即使在ES6中引入了Class类的概念, 但这只是一种语法糖, js并没有实现真正的面向对象。 这里的重载其实可以简单的理解就是为函数提供更丰富的行为
1. 父类的原型对象,是指父类的属性prototype,二者不是一个东西,原型对象prototype上可以保存父类的一些方法(es6中,父类的属性不放在原型对象上)。 2. 父类的原型对象的方法,是在constructor外面定义的, 2.“父类自身的方法”,则是直接在类身上定义的方法,
如果是指“父类原型上的方法”,则是在constructor外面定义的(第一张图);如果是指“父类构造函数上的方法”,则是指在constructor里面定义的,
es6的构造函数constructor相当于es5的构造函数本身,它俩的作用都是给实例添加属性,与es5的构造函数的原型对象prototype上的constructor不是一个东西。
super方法,用来继承父类,所以super里的参数,是实例的属性,在class外面,可以被实例直接访问
//多态就是同一个接口,在不同情况下做不一样的事情。即相同的接口,不同的表现
//接口本身只是一组定义,实现都是在类里面.可以直接理解成需要子类去实现的方法,子类只要重写一个和父类同名的方法,就可以达到一个覆盖的效果
//多态的优点,1、提高类的扩充性与灵活性
//2,暴露接口
//重写
class Human{
say(){
console.log('我是人')
}
}
//子类如果拥有父类的同名方法,则会直接调用子类的方法,不会去走父 类的
class Man extends Human{ say(){
super.say() //输出 我是人
console.log('我是小哥哥')
}
}
class Woman extends Human{
//有的时候子类自己实现的内容,还是依赖父类中的一些操作,可以通过super.xxx的方式去进行访问
say(){
super.say(); //访问父类的同名方法,这里super是作为对象的形式去访问,在非静态方法中访问到的是父类的原型 console.log('我是小姐姐')
}
} new Man().say(); new Woman().say();
、
重载 是根据函数的参数类型以及参数个数去做不一样的事情,
class SimpleCalc{
addCalc(...args){
if(args.length === 0){
return this.zero();
}
if(args.length === 1){
return this.onlyOneArgument(args);
}
return this.add(args);
}
zero(){
return 0;
}
onlyOneArgument(){
return args[0];
}
add(args){
return args.reduce((a,b) => a+b , 0) //返回a+b,从0开始作为基数传递
}
}
重载的其他场景:比如一个Ajax的封装,写函数的时候非常常见
function post(url,header,params){
if(!params){
params = header;
header = null; //或者等于undefined也可以
}
}
post('https://imooc.com',{
a:1,
b:2
});
//一个非常实用的场景,利用重写的特性,达到预留接口的效果
//比如有方法必须要用子类去实现,如果没有就报错
class Monster{
constructor(name,level,model){
this.model = model;
this.name = name;
this.level = level;
}
attack(){
throw Error('必须由子类来实现`attack`(攻击)方法')
}
}
//模型的映射表
const ModelMap = {
'红眼僵尸':1,
'南瓜精':2,
'独眼蝠':3,
'绿眼僵尸':4
}
class RedEyeZombie extends Monster{
//这边的构造函数不用接收参数,因为它的参数开发者是非常明确地,是不需要外部传入的
constructor(){
//通过ModelMap['红眼僵尸']可以访问到模型对应的ID
super('红眼僵尸',10,ModelMap['红眼僵尸']);
}
}
class GreenEyeZombie extends Monster{
constructor(){
super('绿眼僵尸',10,ModelMap['绿眼僵尸'])
}
attack(){
console.log('绿眼僵尸发动了攻击')
}
}
const gez = new GreenEyeZombie();
//覆盖了父类的attack方法
gez.attack();
const rez = new RedEyeZombie();
//子类没有attack,所以去调用父类的,报错
rez.attack();
ES6——简单的多态的更多相关文章
- koa2入门--01.ES6简单复习、koa2安装以及例子
1.ES6简单复习 /*let 和 const: let用于定义一个块作用域的变量,const 定义一个常量 */ let a = 'test'; const b = 2; /*对象的属性和方法的简写 ...
- ES6简单语法
ES6 简单语法: 变量声明 ES5 var 声明变量为全局变量 会变量提升 ES6 let 声明的变量为块级变量 且不能重复声明 不存在变量提升 # {}一个大括号为一个作用域 ES6 const ...
- es6简单介绍
1.ECMAScript 6 简介 2.let和const命令 3.变量的解构赋值 4.字符串的扩展之模板字符串 5.正则的扩展 6.数值的扩展 7.函数的扩展 8.数组的扩展 9.对象的扩展 10. ...
- Vue学习【第二篇】:ES6简单介绍
ECMAScript 6简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScript ...
- ES6简单入门
let let命令用来声明块级作用域. 以前的JavaScript只有全局作用域和函数作用域, 没有块级作用域. // 示例1: if (1) { var a = "hello"; ...
- ES6简单理解基本使用
let const 原来的var声明标识符:可以重复声明,编译不报错. let,const声明标识符:不能重复声明,再声明编译报错. var声明的标识符作用域是当前函数,let和const是当前{块} ...
- ES6简单总结
1.变量声明let和const 我们都是知道在ES6以前,var关键字声明变量.无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部).这就是函数变量提升例如: functi ...
- ES6简单初识
ES常用命令介绍 函数的Rest参数和扩展 Promise使用 Module.exports和ES6 import/export的使用 promise使用 promise 为了解决callback嵌套 ...
- es6简单小复习
Ecmascript 6 ECMAScript 6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了. Ecmascript 是 JavaScript 语言的 ...
随机推荐
- 微信小程序云开发-云存储-上传、下载、打开文件文件(word/excel/ppt/pdf)一步到位
一.wxml文件 <!-- 上传.下载.打开文件一步执行 --> <view class="handle"> <button bindtap=&quo ...
- 安装geatpy库到指定的conda虚拟环境中
在Anaconda Prompt中输入conda install geatpy,提示找不到这个库: 输入pip install geatpy,安装成功:但是安装在默认conda环境下(以下为pycha ...
- 用activiti实现类似钉钉审批流程-附整个系统源码
前言 目前市场上有很多开源平台没有整合工作流,即使有,也是价格不菲的商业版,来看这篇文章的估计也了解了行情,肯定不便宜.我这个快速开发平台在系统基础功能(用户管理,部门管理-)上整合了工作流,你可以直 ...
- 解决Docker安装慢
之前介绍了Ubuntu安装Docker教程,在实际安装过程中,可能受限于国内网络问题,安装缓存或者失败.下面介绍一种通过国内镜像方式,仅需要执行一段脚本即可大幅度提升Docker的安装速度. Linu ...
- tomcat与springmvc 结合 之---第18篇 StandContext容器和SpringMVC的监听器的模型
writedby张艳涛 如何使用tomcat的监听器 public class BootStrap_ex06 { public static void main(String[] args) { Ht ...
- jvm源码解读--04 常量池 常量项的解析CONSTANT_Class_info
接上篇的继续 ConstantPool* constant_pool = ConstantPool::allocate(_loader_data, length, CHECK_(nullHandle) ...
- 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了
最近我们项目升级到了 Spring Boot 2.4.6 + Spring Cloud 2020.0.x,通过我的另一系列即可看出:Spring Cloud 升级之路.但是升级后,我们发现 Young ...
- fastboot刷机小脚本
在Windows系统下,一般刷机命令是在cmd路径下执行如下命令: 1.adb reboot bootloader2.fastboot flash boot +boot路径3.fastboot fla ...
- 工具idea 基于maven 创建springMVC项目
SpringMVC Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单.这些控制器一般不 ...
- I类HDACs是乳酸化修饰“eraser”
赖氨酸酰化修饰 (lysine acylation) 是一种广泛存在的.进化上高度保守的蛋白质翻译后修饰 (post-translational modifications, PTMs) 类型,通过表 ...