1.什么是面向对象
把客观对象抽象成属性数据和对数据的相关操作,把内部细节和不想关的信息隐藏起来,把同一个类型的客观对象的属性数据和操作绑定在一起,封装成类,并且允许分成不同层次进行抽象,通过继承实现属性和操作的共享。
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
- 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
它有三大特点:继承、封装、多态。接下来我们一一介绍:
2.继承
子类继承父类,继承可以把公共方法抽离出来,提高复用,减少冗余
class Animal{
constructor(name) {
this.name=name;
}
eat() {
console.log(`${this.name} eat`)
}
speak() {
}
}
let animal=new Animal('动物');
animal.eat();
class Dog extends Animal{
constructor(name,age) {
super(name);
this.age=age;
}
speak() {
console.log(`${this.name} is barking!`);
}
}
let dog=new Dog('🐶',5);
dog.eat();
dog.bark();
3.封装
把数据封装起来,减少耦合,不该外部访问的不要让外部访问。利于数据的接口权限管理,ES6 目前不支持,一般认为_开头的都会私有的,不要使用。
如何实现:
- public:公有修饰符,可以在类内或者类外使用public修饰的属性或者行为,默认修饰符
- protected:受保护的修饰符,可以本类和子类中使用protected修饰的属性和行为
- private : 私有修饰符,只可以在类内使用private修饰的属性和行为
class Animal {
public name;
protected age;
private weight;
constructor(name,age,weight) {
this.name=name;
this.age=age;
this.weight=weight;
}
}
class Person extends Animal {
private money;
constructor(name,age,weight,money) {
super(name,age,weight);
this.money=money;
}
getName() {
console.log(this.name);
}
getAge() {
console.log(this.age);
}
getWeight() {
console.log(this.weight);
}
}
let p=new Person('zfpx',9,100,100);
console.log(p.name);
console.log(p.age);
console.log(p.weight);
4.多态
所谓多态,就是指一个引用类型在不同情况下的多种状态。在java中多态是指通过指向父类的引用,来调用在不同子类中实现的方法。
js实际上是无态的,是一种动态语言,一个变量的类型是在运行的过程中由js引擎来决定的,所以说js天生就支持多态。
class Animal {
public name;
protected age;
private weight;
constructor(name,age,weight) {
this.name=name;
this.age=age;
this.weight=weight;
}
}
class Person extends Animal {
private money;
constructor(name,age,weight,money) {
super(name,age,weight);
this.money=money;
}
speak() {
console.log('你好!');
}
}
class Dog extends Animal {
private money;
constructor(name,age,weight) {
super(name,age,weight);
}
speak() {
console.log('汪汪汪!');
}
}
let p=new Person('zfpx',10,10,10);
p.speak();
let d=new Dog('zfpx',10,10);
d.speak();