ES6语法:class类,从了解到使用
前期提要:
JavaScript 语言中,在使用类之前,生成实例对象的传统方法是通过使用构造函数。
一、构造函数:
定义:通过 new 函数名 来实例化对象的函数叫构造函数。
主要功能:为初始化对象,特点是和new 一起使用。new就是在创建对象,从无到有,构造函数就是在为初始化的对象添加属性和方法。
注意:任何的函数都可以作为构造函数存在,构造函数定义时首字母大写(规范)。
对new的理解:new 申请内存, 创建对象,当调用new时,后台会隐式执行new Object()创建对象。所以,通过new创建的字符串、数字是引用类型,而是非值类型。
1、常用的构造函数:
var arr = [];为 var arr = new Array()的语法糖
var obj = {}; 为 var obj = new Object()的语法糖
var date = new date()
当然还有很多,这里就不一 一列举了。
2、执行一个构造函数:
function A(name,age){ this.name = name; this.age = age; }
A.prototype.info = function(){
return "姓名"+ "" + this.name + "年龄" + this.age
}
let a = new A("张三",22)//实例化a
//打印 a结果
A{
name:"张三",
age:22
}
//打印 a.info() 结果为 "姓名张三年龄22"
二、class 类
由来:因为上面构造函数的写法跟传统的面向对象语言差异很大,给很多程序员造成很多困惑,所以ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。
通过class关键字,可以定义类。
1、class类基本语法的使用
class A{
constructor(){
//成员属性
this.name = name
this.age = age
}
//静态方法 如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。A.nihao()
static nihao(){
console.log("你好")
}
//成员方法
info(){
return "姓名"+ "" + this.name + "年龄" + this.age
}
}
与上面的构造函数相比之言,新的class写法让对象原型的写法更加清晰、更像面向对象编程的语法。
注意:定义info()方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了,方法与方法之间不需要逗号分隔,加了会报错。
添加静态属性:
静态属性指的是 Class 本身的属性,即Class.propName,而不是定义在实例对象(this)上的属性。
老式写法:
class A{}
A.props=1 //A.props= 1 props就是A的静态属性
新式写法:
class A{
static props = 1
}
新写法是显式声明(declarative),而不是赋值处理,语义更好。
私有方法和私有属性:
私有方法两种写法:
function bar(name){
return this.name = name
}
class A{
foo(name){
bar.call(this,name)
}
}
这样写的原因是类内部的所有方法都是对外可见的。foo是公开方法,内部调用了bar.call(this, baz)。这使得bar()实际上成为了当前类的私有方法。
还有一种方法是利用Symbol值的唯一性,将私有方法的名字命名为一个Symbol值。
const bar = Symbol('bar')
const name = Symbol('name')
class A{
//公有方法
foo(){
this[bra](name)
}
//私有方法
[bar](name){
return this[name] = name
}
}
私有属性
第一种方法是在属性名之前,使用#表示。
class A{
#count = 0
}
注意:#count就是私有属性,只能在类的内部使用(this.#count)。如果在类的外部使用,就会报错。
这种写法不仅可以写私有属性,还可以用来写私有方法。
私有属性也可以设置 getter 和 setter 方法。
class Foo {
#a;
#b;
#xVal = 0;
constructor(a, b) {
this.#a = a;
this.#b = b;
}
#sum() {
return this.#a + this.#b;
}
printSum() {
console.log(this.#sum());
}get #x() { return #xValue; }set #x(value) {this.#xValue = value;
}
}
私有属性不限于从this引用,只要是在类的内部,实例也可以引用私有属性。
私有属性和私有方法前面,也可以加上static关键字,表示这是一个静态的私有属性或私有方法。
2、深入介绍class类和class继承
<1>
ES6 的类,完全可以看作构造函数的另一种写法。
class A{} typeof A //function A === A.prototype.constructor // ture 可以看出,类的数据类型就是函数,类本身就指向构造函数。
使用的时候,也是直接对类使用new命令,跟构造函数的用法完全一致。
<2>
class A{
constructor(){}
info(){}
toString(){}
toVal(){}
}
等同于
A.prototype={
info(){},
toString(){},
toVal(){},
};
构造函数的prototype属性,在类里面也存在,类的所有方法都定义在类的prototype属性上面.
因此,在类的实例上面调用方法,其实就是调用原型上的方法。
<3>
Object.assign() 方法可以很方便地一次向类添加多个方法。如下:
Object.assign(A.prototype,{
toString(){},
toVal(){},
})
<4>
类的内部所有定义的方法,都是不可枚举的,如下:
class A{
constructor(x, y) {
// ...
}
toString() {
// ...
}
}
Object.keys(A.prototype)
// []
<5>
类内部可以忽略不写constructor,因为JavaScript 引擎会自动为它添加一个空的constructor()方法。如下:
class A{} === class A{constructor(){}} //true
<6>
constructor()方法默认返回实例对象(即this),完全可以指定返回另外一个对象。
<7>
类必须使用new调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new也可以执行。
继承:
<1>class 通过extends关键字实现继承,这样的继承方式非常清晰和方便
class A{}
class B extends A{
constructor(){
super() //关键字,super作为函数调用时,代表父类的构造函数
}
} //B类继承了A类的所有属性和方法
<2>Object.getPrototypeof(B)=== A //true 方法可以用来从子类上获取父类 ,因此,可以使用这个方法判断,一个类是否继承了另一个类。
ES6语法:class类,从了解到使用的更多相关文章
- es6 语法 (类与对象)
{ // 基本定义和生成实例 class Parent{ constructor(name='mukewang'){ this.name=name; } } let v_parent1=new Par ...
- ES6语法~解构赋值、箭头函数、class类继承及属性方法、map、set、symbol、rest、new.target、 Object.entries...
2015年6月17日 ECMAScript 6发布正式版本 前面介绍基本语法, 后面为class用法及属性方法.set.symbol.rest等语法. 一.基本语法: 1. 定义变 ...
- Nodejs与ES6系列4:ES6中的类
ES6中的类 4.1.class基本语法 在之前的javascript语法中是不存在class这样的概念,如果要通过构造函数生成一个新对象代码 function Shape(width,height) ...
- ES6中的类
前面的话 大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5.由于类似的库层出不穷,最终还是在ECMAScri ...
- 把JavaScript代码改成ES6语法不完全指南
目录 * 核心例子 * 修改成静态变量(const)或块级变量(let) * 开始修改 * 疑问解释(重复定义会发生什么) * 疑问解释(let的块级作用域是怎样的) * 疑问解释(const定义的变 ...
- 深入理解ES6之——JS类的相关知识
基本的类声明 类声明以class关键字开始,其后是类的名称:剩余部分的语法看起来像对象字面量中的方法简写,并且在方法之间不需要使用逗号. class Person { //等价于prototype的构 ...
- ES6语法的学习与实践
ES6是JavaScript语言的新一代标准,是ECMAScript的第六个版本,加入了很多新的功能和语法,在很多框架,如在使用Vue,React等框架的项目中一般都采用ES6语法来编写的,下面对经常 ...
- ES6中的类和继承
class的写法及继承 JavaScript 语言中,生成实例对象的传统方法是通过构造函数.下面是一个例子 function Point(x, y) { this.x = x; this. ...
- ES6语法知识
let/const(常用) let,const用于声明变量,用来替代老语法的var关键字,与var不同的是,let/const会创建一个块级作用域(通俗讲就是一个花括号内是一个新的作用域) 这里外部的 ...
- es6语法快速上手(转载)
一.相关背景介绍 我们现在大多数人用的语法javascript 其实版本是ecmscript5,也是就es5.这个版本己经很多年了,且完美被各大浏览器所支持.所以很多学js的朋友可以一直分不清楚es5 ...
随机推荐
- C构造类型 数组
一.数组是什么 一组有个固定大小.相同数据类型的数据的集合. 数组可以分为:一维数组.二维数组.三维数组....(维数不止一维:多维数组) 表格 : 行和列(二维数组) 二.一维数组 1.一般形式 类 ...
- 【mq读书笔记】mq消息发送
钩子的注册: DefaultMQProducerImpl#registerSendMessageHook注册钩子处理类,可注册多个. public SendResult sendMessage( fi ...
- IDEA2020.2.4最新激活教程,有效期到2089
前言 昨天又有好多粉丝反馈Idea失效过期,也有群里的小伙伴私聊问我,最新的Idea2020.2.4 版本要如何激活? 于是自己在网上搜罗了各种注册码.激活码,均以失败告终,有的虽然当时成功了,当时很 ...
- 20190703_创建 unity 的配置节处理程序时出错: The type name or alias Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension
创建 unity 的配置节处理程序时出错: The type name or alias Microsoft.Practices.Unity.InterceptionExtension.Configu ...
- Python音视频开发:消除抖音短视频Logo和去电视台标
☞ ░ 前往老猿Python博文目录 ░ 一.引言 对于带Logo(如抖音Logo.电视台标)的视频,有三种方案进行Logo消除: 直接将对应区域用对应图像替换: 直接将对应区域模糊化: 通过变换将要 ...
- 第12.6节 Python标准库其他内置模块导览
一. 文本处理服务 string模块 : 常见的字符串操作 difflib模块: 计算差异的辅助工具 textwrap模块: 文本自动换行与填充,能够格式化文本段落,以适应给定的屏幕宽度: unico ...
- IntelliJ IDEA 学习笔记
之前一直用Eclipse,最近尝试使用IDEA,相较于 Eclipse 而言,IDEA强大的整合能力,比如: Git. Maven. Spring 等:提示功能的快速. 便捷:提示功能的范围广:好用的 ...
- 查询时间倒退一天-项目中惊现神秘BUG-JsonFormat使用采坑记
一.问题由来 前一天下午正在写代码的时候,领导突然走过来跟我说,让我去看一个神秘的BUG,说是在数据库中查询时的一个日期 返回到页面后,查询时间倒退了一天.一听到这个BUG,我就感觉很奇怪,还有这样的 ...
- rpl_semi_sync_master_wait_no_slave 参数研究实验
最近在研究MySQL,刚学到半同步. 半同步的配置中,关于这两个参数: rpl_semi_sync_master_wait_no_slave rpl_semi_sync_master_wait_for ...
- Taro 3.1 beta 发布: 开放式架构新增 4 端支持
作者:凹凸曼-JJ 自 7 月初我们正式发布了 Taro 3,至今半年时间已然略去.期间我们不断地修复着问题,同时也在构想着下一个 minor 版本. 面对小程序平台越来越多的大环境,Taro 是选择 ...