面向对象是什么

651 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

在ES6时代来临之前,JS中对于类的概念是十分弱化的,随着技术的不断完善和发展 ,JS中对于类的概念不再如之前那么弱化、模糊,而类在我们的日常开发过程中也是十分的常见,谈到类就逃不掉面向对象,接下来便一起看看面相对象是什么

面向对象是什么

把客观对象抽象成属性数据和动作数据的相关行为动作(方法),将同一个类型的客观对象的属性数据和操作封装在一起,把内部细节和不相关的数据隐藏

现在有一个Animal类,我们将动物共有的年龄、体重等称之为属性,将吃喝拉撒等称之为行为动作

class Animal {
  constructor(age) {
    this.age = age; //  属性数据
  }
  
  eat() { // 行为动作
    // todo ...
  }
}

const animal = new Animal('cat')

允许分成不同维度进行抽象,通过继承的方式实现属性和动作的共享,一般会按照三个维度进行抽象:面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程(OOP)

子类可以继承父类的公共属性和动作,将公共的动作进行抽离出来,可以很好的提高代码复用性,减少冗余

下面有一个Cat和Dog类,都继承自Animal,那么Cat和Dog都会继承父类的age属性和eat方法

class Cat extends Animal {
  constructor(name) {
    this.name = name; //  属性数据
  }
  
  hobby() { // 行为动作
    // todo ...
  }
}

class Dog extends Animal {
  constructor(name) {
    this.name = name; //  属性数据
  }
  
  hobby() { // 行为动作
    // todo ...
  }
}

const cat = new Cat('tom')
const dog = new Cat('旺财')

封装对象

面向对象的核心就是如何将数据和行为进行抽封装,封装的优势

  1. 为了减少对象之间的耦合,需要将内部私有的和外部可以访问的进行区分,比如人总有一些个人的隐私是不期望外人知道,有些信息是公开的
  2. 利于数据的接口权限管理,可以针对数据的修饰符来决定其访问权限,目前私有属性一般都是以_开头

ES6提供了几个权限修饰符

  • public:默认修饰符,公有修饰符,可以在类内或者类外使用其修饰属性或者行为
  • private:私有修饰符,只可以在当前类内使用其修饰属性和方法
  • protected:受保护修饰符,可以在本类和子类中使用其修饰属性或者行为

下面例子配合修饰符将Animal进行封装

class Animal {
  public name;
  private age;
	protected hobby;
  
  constructor(name, age, hobby) {
		this.name = name; // 公有
    this.age = age; // 私有
    this.hobby = hobby; // 受保护
  }
  
  public eat() { // 行为动作
    // todo ...
  }
}

const animal = new Animal('cat', 2, ['吃鱼'])