跳到主要内容

面向对象基本特征

封装

  • 对象就是一个用来存储不同属性的容器

  • 对象不仅负责属性,还要负责数据的安全

  • 直接添加到对象的属性,并不安全,因为它们可以被任意的修改

  • 如何确保数据的安全:

    1. 私有化数据

      • 将需要保护的数据设置为私有,只能在类内部使用
    2. 提供setter和getter方法来开放对数据的操作

      • 属性设置私有,通过getter setter方法操作带来的好处
        1. 可以控制属性的读写权限
        2. 可以在方法中对属性的值进行验证
    3. 封装主要用来保证数据的安全

    4. 实现封装的方式:

      1. 属性私有化 加#

      2. 通过getter和setter方法来操作属性

        get 属性名(){
        return this.#属性
        }

        set 属性名(参数){
        this.#属性 = 参数
        }
class Person {
/*
实例化使用#开头就变成了私有属性,私有属性只能在类内部访问
*/
#name;
#age;
#gender;

constructor(name, age, gender) {
this.#name = name;
this.#age = age;
this.#gender = gender;
}

sayHello() {
console.log(this.#name);
}

// getter方法,用来读取属性
getName() {
return this.#name;
}

// setter方法,用来设置属性
setName(name) {
// 可以写逻辑
this.#name = name;
}

// 新写法
get age() {
return this.#age;
}

set age(age) {
this.#age = age;
}
}

const p1 = new Person("孙悟空", 18, "男");
p1.setName("猪八戒");
p1.age = 28;
console.log(p1.age); // 28

继承

  • 可以通过extends关键字来完成继承
  • 当一个类继承另一个类时,就相当于将另一个类中的代码复制到当前类中
  • 继承发生时,被继承的类称为 父类(超类),继承的类称为 子类
  • 通过继承可以减少重复的代码,并且可以在不修改一个类的前提对其进行扩展
  • 封装 --- 安全性,继承 --- 扩展性,多态 --- 灵活性
  • 通过继承可以在不修改一个类的情况下对其进行扩展
  • OCP 开闭原则
    • 程序应该对修改关闭,对扩展开放
class Animal {
constructor(name) {
this.name = name;
}

sayHello() {
console.log("动物在叫");
}
}

class Dog extends Animal {
/*
在子类中,可以通过创建同名方法来重写父类的方法
*/
sayHello() {
console.log("汪汪汪");
}
}

class Cat extends Animal {
/*
重写构造函数
重写构造函数时,构造函数的第一行代码必须为super()
*/
constructor(name, age) {
super(name); // 调用父类的构造函数
this.age = age;
}

sayHello() {
// 在方法中可以使用super来引用父类的方法
super.sayHello();
console.log("喵喵喵");
}
}

const dog = new Dog("旺财");
const cat = new Cat("汤姆", 3);

dog.sayHello(); // 汪汪汪
cat.sayHello(); // 动物在叫 喵喵喵
console.log(dog.name); // 旺财
console.log(cat.name, cat.age); // 汤姆 3

多态

  • 在JS中不会检查参数的类型,所以这就意味着任何数据都可以作为参数传递
  • 要调用某个函数,无需指定类型,只要对象满足某些条件即可