ES6给JavaScript带来了类class的概念和实现,实际上是对传统实现方式的一种包装,通过关键字class来定义类,通过extends来实现继承,子类的super是父类的引用,在继承中起着十分重要的作用
- JavaScript语言的传统方法是通过构造函数,定义并生成新对象,prototype 属性使您有能力向对象添加属性和方法
1
2
3
4
5
6
7
8
9
10function Person(x,y){
this.x = x;
this.y = y;
}
Person.prototype.toString = function (){
return (this.x + "的年龄是" +this.y+"岁");
}
let person = new Person('张三',12);
console.log(person.toString());
//张三的年龄是12岁
ES6给我们带来了好消息,它给JavaScript带来了类class的概念。但实际上,JavaScript的类class本质上也是基于原型prototype的实现方式做了进一步的封装,让我们使用起来更简单明了。也就是说它实际上也是函数function和原型prototype实现。
基本用法和生成实例
constructor 相当于构造函数必须要有
1 | //定义一个叫Animal的类 |
- 其中,构造方法constructor是一个类必须要有的方法,默认返回实例对象;创建类的实例对象的时候,会调用此方法来初始化实例对象。如果你没有编写constructor方法,执行的时候也会被加上一个默认的空的constructor方法
类的属性和方法
1
2
3
4
5
6
7
8
9
10
11
12
13class Animal {
//构造方法
constructor(name){
//属性name
this.name = name;
}
//自定义方法getName
getName(){
return this.name;
}
} - 我们把类名后面的括号{ }里面的内容称之为类体,我们会在类体内来编写类的属性和方法。上面的案例中,类体内有2个方法:constructor( )、getName()。
- 其中constructor方法是构造方法,在实例化一个类的时候被调用。constructor方法是必须的,也是唯一的,一个类体不能含有多个constructor构造方法。我们可以在方法里面自定义一些对象的属性,比如案例中的name属性
- 此外,我们还自定义了一个getName( )方法,它属于类的实例方法,实例化后对象可以调用此方法
类的实例对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17class Animal {
//构造方法
constructor(name){
//属性name
this.name = name;
}
//自定义方法getName
getName(){
return 'This is a'+this.name;
}
}
//创建一个Animal实例对象dog
let dog = new Animal('dog');
dog.name; //结果:dog
dog.getName(); //结果:This is a dog - 实例对象的创建有几个要注意的事项
1 必须使用new创建字来创建类的实例对象
2 先声明定义类,再创建实例,否则会报错类的静态方法
- 上面讲到的自定义方法是实例方法,也就是实例化后的对象才可以调用的方法,比如上述案例的getName( )方法。除了实例方法以外,我们还可以定义一种直接使用类名即可访问的方法,我们称之为“静态方法”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20class Animal {
//构造方法
constructor(name){
//属性name
this.name = name;
}
//自定义一个静态方法
static friends(a1,a2){
return `${a1.name} and ${a2.name} are friends`;
}
}
//创建2个实例
let dog = new Animal('dog');
let cat = new Animal('cat');
//调用静态方法friends
Animal.friends(dog,cat);
//结果:dog and cat are friends - 静态方法的定义需要使用static关键字来标识,而实例方法不需要
- 静态方法通过类名来的调用,而实例方法通过实例对象来调用。
类的继承
- 说到类class,就不得不说类的继承,ES6使用extends关键字来实现子类继承父类,我们来演示一下:
1
2
3
4
5
6
7
8
9
10class Parent {/
constructor(name = '王磊'){
this.name = name
}
}
// extends关键字实现类的继承 Parent
class Child extends Parent{
}
console.log('继承',new Child())继承怎么传递参数到父级 修改父级参数呢
- 我们可以用super来引用父类,访问父类的方法,我们来演示一下:
- 关键字super,它相当于是父类中的this
- super(name)就是父类的constructor()参数列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40//父类Animal
class Animal {
//构造方法
constructor(name,age){
//属性name
this.name = name;
}
//父类的自定义方法
say(){
return `This is a animal`;
}
}
//子类Dog
class Dog extends Animal {
//构造方法 继承了Animal
constructor(name,age,color){
super(name,age);/*实例化子类的时候把子类的数据传给父类*/
this.color = color;
this.type='child'
}
//子类的实例方法
getAttritube(){
return `${super.say()},
name:${this.name},
color:${this.color}`;
}
}
//创建Dog的实例对象
let d = new Dog("dog","black");
//调用子类的Dog的实例方法
d.getAttritube();
//结果:This is a animal,
name:dog,
color:black - 使用super有几个要注意的事项:
- super为空的话 父类都使用默认值
- 子类必须在constructor方法中调用super方法
- 必须先调用super( ),才可以使用this,否则报错
getter ,setter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17class Parent {
constructor(name = '王磊'){ //相当于构造函数
this.name = name
}
get longName(){ //属性 不是函数
return 'hello' + this.name
}
set longName(value){ //赋值就是set方法
this.name = value
}
}
let v = new Parent()
console.log('getter',v.longName)// hello王磊
//赋值就是set方法
v.longName = '张欣娅'
console.log('setter',v.longName)// hello张欣娅
ES6给JavaScript带来了类class的概念和实现,实际上是对传统实现方式的一种包装,通过关键字class来定义类,通过extends来实现继承,子类的super是父类的引用,在继承中起着十分重要的作用