# JavaScript教程 - 9 面向对象
面向对象编程(OOP,Object-Oriented Programming),首先涉及到的两个概念就是:类 和 对象。
什么是类?
类就是对现实事物的抽象设计。
例如设计学生的类,可能包括属性:学号,姓名、年龄、性别等。
设计狗的类,可能包括属性:名字、年龄、品种。
类表示的是对一个事物的抽象,不是具体的某个事物。
什么是对象?
对象就是一个具体的实例,这个实例是从类派生出来的。
我们将类的属性赋值,就产生了一个个实例,也就是对象。
例如通过学生的类,我们赋值:学号=001,姓名=张三,年龄=16,性别=男,班级=三年二班,产生了就是一个名字叫张三的具体的学生,这样我们通过给类可以派生出一个个不同属性值的对象,李四、王五、赵六...。
所以说面向对象编程,就是先设计类,然后根据类来生成一个个对象。
# 9.1 类和对象
JavaScript 和其他的面向对象的变成语言有一些区别,在一些其他的语言中,我们需要先创建类,然后根据类来创建对象。但是 在 JavaScript 中可以直接创建对象,就像我们前面讲解对象时一样。这主要是 JavaScript 面向对象实现的原理不同,是基于原型,而非基于类,class
只是语法糖(更简洁更易读的语法),底层仍是原型(ES6 未改变 JavaScript 的 OOP 本质),当然这个后面细说,有个印象。
前面不通过类来创建对象的时候,存在如下问题:
无法区分对象的类型
例如创建多个学生和多个老师对象,没办法区分哪个对象是什么类型的,所有的对象只是有一些属性和方法,没什么本质区别。
批量创建对象很不方便
每次创建对象都需要使用字面量的形式创建,每次都要写各种属性和方法。
下面我们先来定义类,然后通过类来创建对象,看看有什么不同。
# 1 类的定义
类中可以定义属性和行为,属性也就是成员变量,表示这个类有哪些数据信息,行为也叫方法,表示这个类能干什么。
例如,对于学生类而言,学号、姓名、年级就是属性,学习这个行为,可以定义为方法。
那么我们可以定义以下学生类:
/**
*定义类使用class关键字,后面跟类名
*/
class Student {
sid = '001';
name = 'Doubi';
age = 18;
study() {
console.log(`我是${this.name}, 我在学习`);
}
}
2
3
4
5
6
7
8
9
10
11
12
- 上面的类定义了三个成员变量(sid、name、age分别表示学号、姓名、年龄),并赋值了。还定义了一个成员方法
study
,和之前定义对象很相似。
# 2 类的使用
上面我们定义好类了,现在可以使用类来创建对象了。
/**
*定义类使用class关键字,后面跟类名
*/
class Student {
sid = '001';
name = 'Doubi';
age = 18;
study() {
console.log(`我是${this.name}, 我在学习`);
}
}
// 使用类来创建对象
let s1 = new Student(); // 创建一个对象
let s2 = new Student(); // 再创建一个对象
console.log(s1);
console.log(s2);
s1.study();
s2.study();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- 通过
new 类名()
可以创建对象,如果要创建多个对象,new
多次就可以了,上面就创建了两个对象。 - 创建对象后,就像之前操作对象一样了,可以给属性赋值和调用方法。
执行结果:
Student {sid: '001', name: 'Doubi', age: 18}
Student {sid: '001', name: 'Doubi', age: 18}
我是Doubi, 我在学习
我是Doubi, 我在学习
2
3
4
但是上面两个对象的值都是一样的呀,但需要注意,这是两个不同的对象!
因为我们直接在类中给各个属性赋值,所以这些值各个对象都会会拥有,注意每次使用 new 创建一个对象,相当于复制了一份数据,我们可以单独再修改每个对象的属性值就可以了。
但是再修改每个对象的值也太麻烦了,能不能在创建对象的时候指定属性值呢?
这就用到构造函数。