面向对象的特征

101 阅读3分钟

面向对象的特征:

  • 封装性---(安全性)
  • 继承性---(扩展性)
  • 多态性---(灵活性)

面向对象的编程指,程序中的所有操作都是通过对象来完成

做任何事情之前都需要先找到它的对象,然后通过对象来完成各种操作

1.封装

  • 对象就是一个用来存储不同属性容器
  • 对象不仅存储属性,还要负责数据的安全
  • 直接添加到对象中的属性,并不安全,因为它们可以被任意的修改

如何确保数据的安全:

  • 1.私有化数据

将需要保护的数据设置为私有,只能在类内部使用

  • 2.提供setter和getter方法来开放对数据的操作

属性设置私有,通过getter setter方法操作属性带来的好处

(1) 可以控制属性的读写权限 ( 比如:我可以只给获取权限,不给修改权限)

(2) 可以在方法中对属性的值进行验证

get和set的格式是:

get 属性名(){
    return this.#属性
}
​
set 属性名(参数){
    this.#属性 = 参数
}

封装主要用来保证数据的安全

  • 实现封装的方式:
// 1.属性私有化   加  #
class Person {
  #name = "孙悟空" 
  constructor(name,age) {
    this.#name = name   
    // 如果想给私有属性赋值,必须得先声明,才能访问
    this.age = age
  }
}
​
// 通过getter和setter方法来操作属性
class Person2 {
  #name = "孙悟空"
  get gender() {
    return this.#name
  }
  set gender(name) {
    this.#name = name
  }
}
const p2 = new Person2( )
p2.gender   // 通过p2.gender获取属性
p2.gender = "猪八戒"  // 通过set修改
console.log(p2.gender);

当然上面是使用get和set的格式,我们也有简单直接的写法,如下:

class Person3 {
  #age = 18
  getAge() {
    return this.#age    // 直接定义一个函数
  }
  setAge(age) {
    this.#age = age
  }
}
const p3 = new Person3()
console.log(p3.getAge());
p3.setAge(20)
console.log(p3.getAge());

2.多态

  • 在JS中不会检查参数的类型,所以这就意味着任何数据都可以作为参数传递
  • 要调用某个函数,无需指定的类型,只要对象满足某些条件即可
  • 如果一个东西走路像鸭子,叫起来像鸭子,那么它就是鸭子

多态为我们提供了灵活性

定义一个函数,这个函数将接收一个对象作为参数,他可以输出hello并打印对象的name属性

class Person {
  constructor(name) {
    this.name = name
  }
}
const dog = new Person("旺财")
const person = new Person("孙悟空")
function sayHello(obj) {
  console.log("Hello"+ obj.name);
}
sayHello(dog)   // 不管我调用时传入的是dog还是persn
sayHello(person)  // 它都会能打印出hello+旺财或者+孙悟空
// 它是不受限制的

3.继承

继承的意思是减少代码的重复性,并且可以在不修改一个类的前提对其进行扩展

当一个类继承另一个类时,就相当于将另一个类中的代码复制到了当前类中(简单理解)

通过 extends关键字来进行继承

被继承的类是父类(超类),继承的类是子类

class Person {
  constructor(name){
    this.name = name
  }
  sayHello() {
    console.log("动物们在叫");
  }
}
const p1 = new Person("孙悟空")  
// 比如我想把Person类里面的东西继承给别的类
class Dog extends Person {
}
const dog = new Person("狗")  // dog里就有name和sayhello方法了
// 但是为什么要这样干呢?
因为假如我要写多个类,而他们里面都有name和sayhello方法,那我就可以用继承,这样节约了代码的重复性

继承的扩展

通过继承可以在不修改一个类的情况下对其进行扩展

一般在开发中,别人写的类,可能需要很多人用,你不能直接修改,所以通过继承,这样避免修改源代码

class Person {
  constructor(name) {
    this.name = name 
  }
  sayHello() {
    console.log("动物们在叫");
  }
}
class Dog extends Person {
  sayHello() {
    console.log("汪汪汪");
    super.sayHello() // 调用父类的sayhello
  }
  // 重写构造函数
  constructor(name) {// 重写构造函数第一行代码必须是super()
    super(name)  // 调用父类的super
    this.age = 1  // 也可以在重写的构造函数里加新的属性
  }
}
const dog = new Dog("狗")
dog.sayHello()
console.log(dog);