# JavaScript教程 - 9 面向对象

面向对象编程(OOP,Object-Oriented Programming),首先涉及到的两个概念就是:对象

什么是类?

类就是对现实事物的抽象设计。

例如设计学生的类,可能包括属性:学号,姓名、年龄、性别等。

设计狗的类,可能包括属性:名字、年龄、品种。

类表示的是对一个事物的抽象,不是具体的某个事物。

什么是对象?

对象就是一个具体的实例,这个实例是从类派生出来的。

我们将类的属性赋值,就产生了一个个实例,也就是对象。

例如通过学生的类,我们赋值:学号=001,姓名=张三,年龄=16,性别=男,班级=三年二班,产生了就是一个名字叫张三的具体的学生,这样我们通过给类可以派生出一个个不同属性值的对象,李四、王五、赵六...。

所以说面向对象编程,就是先设计类,然后根据类来生成一个个对象。


# 9.1 类和对象

JavaScript 和其他的面向对象的变成语言有一些区别,在一些其他的语言中,我们需要先创建类,然后根据类来创建对象。但是 在 JavaScript 中可以直接创建对象,就像我们前面讲解对象时一样。这主要是 JavaScript 面向对象实现的原理不同,是基于原型,而非基于类,class 只是语法糖(更简洁更易读的语法),底层仍是原型(ES6 未改变 JavaScript 的 OOP 本质),当然这个后面细说,有个印象。

前面不通过类来创建对象的时候,存在如下问题:

  1. 无法区分对象的类型

    例如创建多个学生和多个老师对象,没办法区分哪个对象是什么类型的,所有的对象只是有一些属性和方法,没什么本质区别。

  2. 批量创建对象很不方便

    每次创建对象都需要使用字面量的形式创建,每次都要写各种属性和方法。

下面我们先来定义类,然后通过类来创建对象,看看有什么不同。

# 1 类的定义

类中可以定义属性和行为,属性也就是成员变量,表示这个类有哪些数据信息,行为也叫方法,表示这个类能干什么。

例如,对于学生类而言,学号、姓名、年级就是属性,学习这个行为,可以定义为方法。

那么我们可以定义以下学生类:

/**
 *定义类使用class关键字,后面跟类名
 */
class Student {
  sid = '001';
  name = 'Doubi';
  age = 18;
  
  study() {
    console.log(`我是${this.name}, 我在学习`);
  }
}
1
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();
1
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, 我在学习
1
2
3
4

但是上面两个对象的值都是一样的呀,但需要注意,这是两个不同的对象!

因为我们直接在类中给各个属性赋值,所以这些值各个对象都会会拥有,注意每次使用 new 创建一个对象,相当于复制了一份数据,我们可以单独再修改每个对象的属性值就可以了。

但是再修改每个对象的值也太麻烦了,能不能在创建对象的时候指定属性值呢?

这就用到构造函数。

内容未完......