112-面向对象

148 阅读6分钟

目录

  • 类和对象

  • 构造函数

  • this

  • 类属性和类行为

  • 继承

  • 前提

    • 能够理解已学内容的语法:new Object()、Promise.all
    • 深入学习模块化编程

一、面向对象基础(ES6)

1.1 类和对象

1.1.1 生活中的类和对象

img

  • 类是具有相似属性和行为的事物的统称,比如人、汽车、上班族、学生、跑车、轿车每一个都是一个类。类有大类和小类之分。人是一个大类,包含了学生、上班族这些小类。

  • 对象是某个类的具体表现。即一个具体的事物,也称为实例。比如隔壁小美,我自己的电脑,隔壁老王的奔驰车都是一个对象。

  • 类和对象之间的关系

    • 类是对象的模板,对象是类的具体表现。

    img

  • 为什么需要类和对象

    • 我们需要借助计算机完成生活数据的处理。明确计算机中如何表达生活数据以及如何进行数据交互。生活数据指用户、商品、订单、拼团商品等。

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 继承应用

  • 当程序中存在多个类,并且这些类都具有很多相同的属性和行为时,就可以利用继承进行优化。

    • 一般会针对这些相同的属性和行为,新建一个父类。然后让这些类继承该父类。