目录
-
类和对象
-
构造函数
-
this
-
类属性和类行为
-
继承
-
前提
- 能够理解已学内容的语法:new Object()、Promise.all
- 深入学习模块化编程
一、面向对象基础(ES6)
1.1 类和对象
1.1.1 生活中的类和对象
-
类是具有相似属性和行为的事物的统称,比如人、汽车、上班族、学生、跑车、轿车每一个都是一个类。类有大类和小类之分。人是一个大类,包含了学生、上班族这些小类。
-
对象是某个类的具体表现。即一个具体的事物,也称为实例。比如隔壁小美,我自己的电脑,隔壁老王的奔驰车都是一个对象。
-
类和对象之间的关系
- 类是对象的模板,对象是类的具体表现。
-
为什么需要类和对象
- 我们需要借助计算机完成生活数据的处理。明确计算机中如何表达生活数据以及如何进行数据交互。生活数据指用户、商品、订单、拼团商品等。
1.1.2 程序中的类和对象(ES6)
-
不同的编程语言都对类和对象提供了语法的支持,在程序中就可以使用类和对象,从而可以让计算机处理生活类的数据。以JavaScript语法为例
-
创建一个类
class 类名{ //类的具体内容 }- 类名一般遵循大驼峰格式:每个单词首字母大写
-
根据某个类创建一个对象
let 对象变量名 = new 类名(); -
给类添加属性和行为
class 类名{ //构造函数:声明每个对象都有的属性 constructor(){ this.属性名1 = 值1; this.属性名1 = 值1; this.属性名1 = 值1; } //声明函数作为每个对象都有的行为,本质是函数,语法 不需要写function关键字 行为名1(){ } 行为名2(){ } 行为名n(){ } } -
调用属性和行为
对象名.属性名对象名.行为名(); -
例子:人
class People { //构造函数:声明每个对象都有的属性 constructor() { this.name = "张三"; this.age = 12; this.sex = "男"; } //声明函数作为每个对象都有的行为,本质是函数,语法 不需要写function关键字 eat() { console.log('吃饭'); } sleep() {} playGame() {} goShopping() {} } //创建对象 let p1 = new People(); let p2 = new People(); let p3 = new People(); console.log(p1.name); console.log(p2.age); console.log(p3.sex); -
目前的问题:每个对象的属性都是一模一样的,应该每个对象都有相似的属性,但值应该是不一样的,比如两个人,都应该具有不一样的姓名、性别、年龄等。
1.2 构造函数
-
前提:可以使用构造函数实现每个对象属性值的不同
-
概念:构造函数就是一个特殊的函数,只会在新建对象时会自动调用一次,其构造函数代码就是
constructor部分 -
特点
- 构造函数只能在新建对象时自动触发。不能通过代码手动调用
- 支持参数的使用。在新建对象时,可以向构造函数传递实际参数,并在构造函数代码体接受参数并使用
-
基础语法
class 类名{ //构造函数 construnctor(){ } } let 对象 =new 类名();//会自动调用构造函数 -
完整语法
class 类名{ //构造函数 construnctor(name,age,sex){ this.name=name; this.age =age; this.sex = sex; } } let p1 =new 类名("张三",12,'男') let p2 =new 类名("李四",21,'女') console.log(p1.name);//张三 console.log(p2.name);//李四
1.3 this
1.4 基础语法练习
-
定义类和对象
1.定义商品类,都有名称、价格、库存、描述等属性,都有上架、下架等行为.用程序表达该类和创建桑商品对象:卫龙辣条 5 999 好吃又不贵
1.5 this
-
概念:this是JavaScript中的一个特殊内置全局变量,在不同代码环境下可能指向的数据是不同的。
-
特点
- this一定指向的是一个对象,谁用this调用了属性或行为,this就指的谁。
-
语法
class 类名{ 行为名(){ console.log(this) } } -
作用
- 方便使用自身的其他属性或行为
1.6 类属性和类行为
1.6.1 类属性
-
概念:类属性是指通过类调用的属性,类属性是唯一的,并且在行为中是所有对象共享的。即类属性在面向对象中可以简单理解为类中的
全局变量. -
语法
//1. 定义类属性:用static修饰 class 类名{ static 类属性名1 = 值1; static 类属性名2 = 值2; constructor(){} } //2. 使用类属性 console.log(类名.类属性名); 类名.类属性名 = 新数据;//修改 -
特点
- 类属性是整个类唯一的,跟对象不挂钩,所有对象共享。
1.6.2 类行为
-
概念:由static修饰符修饰的行为,类行为只能由类来调用。
-
作用:一般作为工具函数来使用
-
特点
- 类行为是由类来调用,跟对象无关,所以类行为里的this指向的不是对象,而是指向的是类本身
-
语法
class 类名{ constructor(){} static 类行为名1(){ } static 类行为名2(形式参数){ } } 2. 使用类行为 类名.类行为名(实际参数); -
应用场景
- 一般类行为会当作工具函数来使用。所谓工具函数是指跟对象无关并实现一定功能的函数。
- 例子:自定义随机数类(Random类),实现可以获取指定范围内的一个随机整数,或者从1到指定数字之间的随机整数。
//定义一个随机类,包含了多个行为实现各种形式的随机数 class Random{ constructor(){ } //获取指定范围内的随机整数 //20~100 static random(start,end){ return start + Math.floor(Math.random()*(end -start +1)); } } let num = Random.random(20,100);
二、继承
- 前提:如果面对多个具有很多相同属性和行为的类时,就可以使用继承来优化代码。
2.1 基础概念
- 从生活上来讲。继承意味者后代可以直接获取祖先遗留下来的资产,后代不劳而获。
- 从程序上来讲:继承意味着一个类B可以直接使用另一类A里的属性和行为。我们就可以成这两个类存在继承关系,是类B继承了类A。也可以说类B是子类,类A是父类。
2.2 继承语法
class 父类{
constructor(){
}
}
class 子类 extends 父类名{
constructor(){
super();
}
}
- extends 表示子类继承父类里已经定义的行为
- super()本身指的是父类的构造函数,当新建子类对象时,会自动通过super调用一次父类的构造函数,将父类构造函数里定义的属性赋给子类对象。即super()的作用以子类对象调用了一次父类构造函数,保证了子类对象拥有了父类构造函数中定义的属性。
super()必须是在子类构造函数的第一行。
2.3 继承特点
- 如果子类拥有跟父类同名的行为或属性时,程序会优先使用子类的同名属性和行为。我们一般也会把继承这个特点称为
重写.即子类重写了父类的属性或行为。 - 当子类构造函数只有super()一句代码时,没有其他新增的属性,那么子类的整个构造函数可以省略不写。仅限于子类可以不写。
2.4 继承作用
- 减少大量的代码量
- 规范子类的行为和属性
2.5 继承应用
-
当程序中存在多个类,并且这些类都具有很多相同的属性和行为时,就可以利用继承进行优化。
- 一般会针对这些相同的属性和行为,新建一个父类。然后让这些类继承该父类。