js之ES6的Class类
JavaScript ES6之前的还没有Class类的概念,生成实例对象的传统方法是通过构造函数。
例如:
function Mold(a,b){
this.a=a;
this.b=b;
}
Mold.prototype.count=function(){
return this.a+this.b;
};
let sum=new Mold(1,2);
console.log(sum.count()) //
这中写法跟传统的面向对象语言差异较大,写起来也比较繁杂。
ES6提供了更加接近其他语言的写法,引入了Class(类)的概念,作为对象的模板,可以通过class关键字,定义类(类似python、java等);
当然ES6的大部分功能再ES5都能实现,ES6的class
可以看作是一个语法糖,只是新的class
定义类的写法让对象原型的写法更加简单明了、更接近与面向对象的编程思想。与上面ES5写的类使用ES6实现,例如:
class Mold{
constructor(a,b){
this.a=a;
this.b=b;
}
count(){
return this.a+this.b;
}
}
let sum=new Mold(1,2);
console.log(sum.count()) //
这里ES6的类,只需用
class
定义,并且类的方法不需要用function定义;还有ES6的constructor
方法,代表这该类的构造方法;并且它的this
关键字指向着实例对象。这里ES5的构造函数Mold,相当于ES6Mold类的constructor
方法。
constructor
- ES6实例对象的构造函数就是该类本身;并且当我们new 类名()就是执行了constructor这个函数。
例如:
class Mold{
constructor(){
console.log("aaa")
}
}
let m=new Mold();// aaa
console.log(m.constructor===Mold);//true
上面代码Mold类的constructor,实例化对象时执行默认constructor
;
- 任何对象都有构造函数,并且构造函数与当前对象的类是相同;
例如:
let arr=new Array();
console.log(arr.constructor===Array);//true
let str=new String();
console.log(str.constructor===String);//true
let obj=new Object();
console.log(obj.constructor===Object);//true
2. 类的继承 extends
继承父类后,子类会继承父类所有的方法和属性(包括静态方法和属性)
如果子类没有定义
constructor
方法,会默认被添加该方法任何子类都有
constructor
方法;
例如:
//class 类名 extends 被继承的类{}
Class Father{
constructor(){
}
sum(){
console.log("abc");
}
static fn(){
console.log("hello")
}
}
Class Son extends Father{ }
let s=new Son();
s.sum()//abc,继承了父类的sum()方法
Son.fn()//hello 继承了父类的静态方法fn()
- 继承后的子类方法的三种处理:
1). 完全继承,不需要重写这个方法,子类执行继承方法内容与父类相同
2). 重写覆盖,只需要在这个类中重写这个方法就可以覆盖继承过来的内容
3). 加工,子类可以用
super
调用父类的方法或属性进行加工,再加上子类自己的方法和属性
3. super
调用父类的构造函数直接使用
super()
,并且可以传参;子类的构造函数中,只有调用了
super
之后才可以使用this
关键字,否则会报错;
例如:
//super.父类函数();
class Father{
constructor(){
console.log("bbb");
}
}
class Son extends Father{
constructor(x){
this.x=x;//ReferenceError,报错
super();
this.x=x;//正确
}
}
let sum=new Son();//bbb
4. 类的static静态
在属性或方法前面使用
static
定义类的静态属性和方法;所有的静态属性和静态方法都不能通过实例化的对象调用;
需要通过类来调用,静态属性和静态方法是类的专属属性和方法,和实例化对象无关,比如数组和数学方法中的:
Array.from();Math.random()。
例如:
class Mold{
static x=0;
y=1;
static fn1(){
console.log("aaa")
}
fn2(){
console.log("bbb");
}
}
let m=new Mold();
console.log(m.x,m.y);//undefined , 1
m.fn1(); // TypeError
m.fn2(); // bbb
//需要通过类来调用
Mold.fn1(); //aaa
console.log(Mold.x);//
- 静态的使用场景:
一般静态的方法是用来解决一系列该类型的方法;
解决具体类型的方法,不是解决某个具体对象的方法
静态属性,一般用于存储该类型的一系列通用的属性变量
这种存储,在类创建的时候就已经变成全局的了,可在任何地方调用,并且不会被自动销毁
js之ES6的Class类的更多相关文章
- ES6中的类
前面的话 大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5.由于类似的库层出不穷,最终还是在ECMAScri ...
- 原生JS动态添加和删除类
原生JS动态添加和删除类 由于需要, 给按钮组监听点击事件(要求用事件委托),当有一个按钮被点击时,相应的给该按钮添加一个类(激活类),其他没有点击的按钮就要移出该类 添加和和删除类有三种方法 首先等 ...
- Atitit js es5 es6新特性 attilax总结
Atitit js es5 es6新特性 attilax总结 1.1. JavaScript发展时间轴:1 1.2. 以下是ES6排名前十的最佳特性列表(排名不分先后):1 1.3. Es6 支持情况 ...
- js面向对象设计之class类
class 相对 function 是后出来的,既然 class 出来了,显然是为了解决 function 在处理面向对象设计中的缺陷而来.下面通过对比,来看看 class 作为 ES6 中的重大升级 ...
- 160803、如何在ES6中管理类的私有数据
如何在ES6中管理类的私有数据?本文为你介绍四种方法: 在类的构造函数作用域中处理私有数据成员 遵照命名约定(例如前置下划线)标记私有属性 将私有数据保存在WeakMap中 使用Symbol作为私有属 ...
- ES6里关于类的拓展(二):继承与派生类
继承与派生类 在ES6之前,实现继承与自定义类型是一个不小的工作.严格意义上的继承需要多个步骤实现 function Rectangle(length, width) { this.length = ...
- ES6里关于类的拓展(一)
大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5.由于类似的库层出不穷,最终还是在ECMAScript 6中 ...
- es6入门5--class类的基本用法
在ES6之前,准确来说JavaScript语言并无类的概念,却有模拟类的做法.相比在类似java这类传统面向对象语言中通过类来生成实例,js则通过构造函数模拟类来生成实例. 这是因为在JS设计初期,作 ...
- TypeScript完全解读(26课时)_7.ES6精讲 - 类Class基础
ES6精讲 - 类Class基础 es5中创建构造函数和实例 原来在es5中的写法 定义好Point后,在原型对象上定义getPostion的方法 实例自身是没有这个方法的,我们调用的时候会去创建他的 ...
随机推荐
- c++ 中的单例类模板的实现方法
1.什么是单例模式 在架构设计时,某些类在整个系统生命周期中最多只能有一个对象存在 ( Single Instance ).如超市收银系统,其外观主要由显示器(1个).扫描枪(1个).收款箱(1个)组 ...
- python的基本数据类型简介
python的基本数据类型有:数字-numbers.字符串-str.列表-list.元组-tuple.字典-dict.布尔-bool.集合-set 下面来个概览先大概了解一下,后面博文中咱再细说- 1 ...
- R语言实战(一) R语言介绍
从2018年秋季(大二上学期)开始接触R语言,曾在2019年寒假读过一遍本书的第一版,感觉受益匪浅,之后遇到问题也曾回头来查阅这本书,前几天刚学习过Simulink,趁现在有空再来温习这本书,回顾一下 ...
- ipadmini从9.3.5降级8.4.1并完美越狱
ipadmini之前是iOS9.3.5实在是卡的用不了,于是打算降级,但是尝试了包括改版本描述等很多方法一直失败.今天突然成功降级8.4.1并且完美越狱,运行流畅了非常多.赶紧发个教程,回馈一下网友. ...
- 【转】分布式架构的演进(JavaWeb)
作者:李小翀 链接:https://www.zhihu.com/question/22764869/answer/31277656 来源:知乎 1.初始 初始阶段 的小型系统 应用程序.数据库.文件等 ...
- Minio 集群扩容存储空间,配合nginx 负载反向代理后端minio 集群服务器,提升高可用性
环境:Centos 7 软件:minio,Etcd 需求:通过联盟两个集群实例,实现水平扩容存储空间问题: 服务器使用阿里云,一共4台服务器(官方说明最好4台服务器做分布式,测试节省服务器所以我们使 ...
- 微信小程序开发(四)学习基本组件
现在我们已经学会使用工具了,再来了解,测试一下微信小程序的常用组件,所谓组件,就是微信团队已经开发好的一些常用标签,我们只需要掌握用法就可以了,当然,以后学得深入了,也可以开发自己的组件,让其他人使用 ...
- Cisco二层交换机命令
1.二层交换机基本配置 Switch >Switch >enable # 进入特权模式 Switch#configure terminal # 进入全局配置模式 Switch(co ...
- python+selenium之悠悠博客学习笔记
1 Python之自动化测试框架selenium学习 offical website 悠悠之selenium浅谈·博客园 悠悠软件测试系列 1.1 基础环境准备 1.1.1 python包下载工具的安 ...
- 【bug】table重新加载数据,页面滚动条下沉到底部,记录scrollTop后将其恢复scrollTop出现闪烁
1.table数据请求前记录scrollTop $scope.scrollPos = document.documentElement.scrollTop; 2.html中添加指令repeat-fin ...