ES6中的class详解及拓展

需求

最近项目中,需要针对项目封装一些常用的class类,由于ES6提供了class,肯定再用模拟类写法就不太好了,所以尝鲜,对class类进行学习和研究

基本概念讲解

1 class理解

1 在ES6中,class ()作为对象的模板被引入,可以通过 class 关键字定义类
2 class 的本质是 function
3 它可以看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法

需要弄清楚的几个常见概念,这里我就不一一列举了,都很简单
1 类定义(显隐两种声明方法)
2 类属性,类方法(注意静态方法,基本用不到吧)
3 constructor 方法,说白了,就是构造方法,实例化时调用
eg

class test{
	constructor (){}
    add(){
       console.log("hehe")
         }
}

new test().add();

在这里插入图片描述差不多就是这样用咯;
4 还有就是一些私有方法,共有方法的研究

class test{
	#count=0;
	static val=1;
	pin=2;
	constructor(){
		console.log(test.val);
	}
}
console.log(a.val);
let a = new test();

// console.log(a.#count); //私有方法,会报错
console.log(a.val);
console.log(a.pin);

在这里插入图片描述建议自己跑一下,会有深刻的理解
5 关于静态方法的时候,

class test_father{
	 static a = 10;
	 static hello(){
	 	console.log("hello world")
	 }
	 constructor(){
	 	 console.log(test_father.a);
	 }
}
 class test1 extends test_father{
	 
 }

new test_father();

其实还是有很多不是很规范,建议自己跑一下,很多跟自己想像的不是一样的
写一些小demo测试吧,主要是对属性,私有属性,静态属性,方法,私有方法,静态方法的测试,总结以下几点
1 属性可以直接在顶层定义,有常规属性,私有属性(#name),静态属性(static name),静态私有属性(static #name)
2 对于这些属性的增删改差
3 方法类比属性

高级概念讲解

1 extends理解
extends相当于Java中的继承,也就是说,子类从父类那里继承得到一些属性和方法

class test_father{
	 static a = 10; //静态属性
	 b=3; //常规属性
	 #c =7;//私有属性
	 static hello(){
	 	console.log("hello world")
	 }
	 hello1(){
	 	console.log("11111")
	 }
	 
	 constructor(){
	 	 console.log(test_father.a);
	 	 console.log(this.b);
	 }
}
 class test1 extends test_father{
	 constructor(){
// 	 	super();
// 	 	console.log(super.a);
	 }
	 exptr(){
	 	console.log();
	 }
 }


new test1();

在这里插入图片描述当我们不调用super的时候,发现报错了;所以,在子类中,是需要调用super来指定this的,具体的本质原因,这里我摘录阮一峰大神的话:

子类必须在constructor方法中调用super方法,
否则新建实例时会报错。这是因为子类自己的this对象,
必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,
然后再对其进行加工,加上子类自己的实例属性和方法。如果不调用super方法,子类就得不到this对象
class test_father{
	 static a = 10; //静态属性
	 b=3; //常规属性
	 #c =7;//私有属性
	 static hello(){
	 	console.log("hello world")
	 }
	 hello1(){
	 	console.log("11111")
	 }
	 
	 constructor(){
	 	 console.log(test_father.a);
	 	 console.log(this.b);
	 }
}
 class test1 extends test_father{
 	b=4;
	 constructor(){
	 	super();

	 	console.log(this.b);
	 	console.log(super.b);
	 	console.log(super.a);
	 	super.hello1();
	 }
	 exptr(){
	 	console.log();
	 }
 }



let tt = new test1();
console.log(tt);

在这里插入图片描述然后分析下结构,发现最后还是转到了prototype上面;
下面我们看下super的作用

class test_father{
	 static a = 10; //静态属性
	 b=3; //常规属性
	 #c =7;//私有属性
	 static hello(){
	 	console.log("hello world")
	 }
	 hello1(){
	 	console.log("11111")
	 }
	 
	 constructor(){
	 	console.log(new.target.name);
	 }
}
 class test1 extends test_father{
 	b=4;
	 constructor(){
	 	super();
        console.log(new.target.name);
	 }
	 exptr(){
	 	console.log();
	 }
 }


new test_father();
let tt = new test1();

在这里插入图片描述
可以看到啊,通过super调用父类的构造方法后,this指向的对象其实是子类
然后就是super当对象使用时,在子类里调用父类的属性和方法,调用父类属性的时候只有在prototype上才可以调到;

在这里插入图片描述在这里插入图片描述暂时先这样吧,基本可以用了.推荐看下阮一峰的讲解
https://es6.ruanyifeng.com/#docs/class-extends
跟着练习几遍就OK了;后期还是需要理解下prototype的本质实现,以后在写一篇博文记录下难点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ES6class可以让我们更方便地定义类和面向对象的编程模式。下面是一些关于ES6 class的详细解释: 1. 定义类 使用class关键字定义一个类,类名通常首字母大写。例如: ``` class Person { constructor(name, age) { this.name = name; this.age = age; } sayHello() { console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`); } } ``` 上面的代码定义了一个Person类,包含一个构造函数和一个sayHello方法。 2. 构造函数 类的构造函数使用constructor关键字定义,用于初始化对象的属性。例如: ``` class Person { constructor(name, age) { this.name = name; this.age = age; } } ``` 上面的代码定义了一个Person类,包含一个构造函数,构造函数接收name和age两个参数,并将其分别赋值给对象的name和age属性。 3. 方法 类的方法可以像普通函数一样定义,例如: ``` class Person { constructor(name, age) { this.name = name; this.age = age; } sayHello() { console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`); } } ``` 上面的代码定义了一个Person类,包含一个sayHello方法,该方法用于打印对象的name和age属性。 4. 继承 ES6class支持继承,使用extends关键字实现继承。例如: ``` class Student extends Person { constructor(name, age, grade) { super(name, age); this.grade = grade; } study() { console.log(`${this.name} is studying in grade ${this.grade}.`); } } ``` 上面的代码定义了一个Student类,该类继承自Person类,包含一个构造函数和一个study方法。构造函数接收name、age和grade三个参数,其name和age由父类的构造函数初始化,grade由子类的构造函数初始化。 5. 静态方法 类的静态方法使用static关键字定义,可以直接通过类名调用,例如: ``` class MathUtils { static add(x, y) { return x + y; } static subtract(x, y) { return x - y; } } ``` 上面的代码定义了一个MathUtils类,包含两个静态方法add和subtract,这两个方法可以直接通过类名调用。 6. 属性 ES6class支持定义属性,可以使用get和set关键字定义属性的读写方法。例如: ``` class Person { constructor(name, age) { this._name = name; this._age = age; } get name() { return this._name; } set name(name) { this._name = name; } get age() { return this._age; } set age(age) { this._age = age; } } ``` 上面的代码定义了一个Person类,包含两个属性name和age,这两个属性的读写方法分别由get和set关键字定义。注意,属性名前面加上了一个下划线,这是一种约定俗成的做法,用于表示私有属性,防止属性被直接访问。 7. 静态属性 ES6class支持定义静态属性,使用static关键字定义静态属性。例如: ``` class MyClass { static myStaticProperty = 42; } ``` 上面的代码定义了一个MyClass类,包含一个静态属性myStaticProperty,该属性的初始值为42。 总结: ES6class为JavaScript提供了更加完整和规范的面向对象编程模式,支持继承、静态方法、属性等等。使用class可以让我们更方便地定义类和对象,提高代码的可读性和维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李卓书

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值