小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
在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('旺财')
封装对象
面向对象的核心就是如何将数据和行为进行抽封装,封装的优势
- 为了减少对象之间的耦合,需要将内部私有的和外部可以访问的进行区分,比如人总有一些个人的隐私是不期望外人知道,有些信息是公开的
- 利于数据的接口权限管理,可以针对数据的修饰符来决定其访问权限,目前私有属性一般都是以_开头
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, ['吃鱼'])