概念理解
1. 面向过程编程
面向过程编程是一种以过程为中心的编程思想,分析解决问题的步骤,然后使用函数的方式把这些 步骤
一步一步的实现。
特点:数据和对数据的操作是分离的。
2. 面向对象编程
面向对象编程是将事务对象化,通过 对象通信
来解决问题。
特点:数据和对数据的操作是绑定在一起的。
2.1 es5 面向对象的编程实现方式:
function Person (name) {
this.name = name;
this.getName = function () { // 给对象添加方法,还可以通过原型来添加 (Person.prototype.getName = ...)
console.log(this.name);
}
this.setName = function (name) {
this.name = name;
}
}
let person = new Person('zlq');
person.getName();
2.2 es6 提供了新的语法来实现面向对象编程(class),类的写法更加接近面向对象,只不过是语法糖的表达方式(是基于原型语法的语法糖):
class Person {
// 类的构造函数实力化的时候执行,new 的时候
constructor (name) {
this.name = name;
}
getName() {
console.log(name);
}
// ...
}
2.3 三大特征:
三大特征分别是:封装、继承、多态
2.3.1 封装
我们平时所用的方法和类都是封装,当我们在项目发展中,有一段代码被多处重复调用时,就可以把它封装成一个功能方法对外提供。
2.3.2 继承
继承在我们的项目中主要发生在子类继承父类中
class Father {
constructor (name) {
this.name = name;
}
// 实例方法,通过实例调用
getName() {
console.log(name);
}
// 静态方法不会被继承,通过类名来调用
static test () {
alert('我是静态方法');
}
}
class Son extends Father {
constructor (name, age) {
// super 必须有,实例化子类的时候把子类数据传递给父类,super中的参数是继承的父类实例化所需要的数据
super(name);
this.age = age;
}
}
注意:继承只会拿到父类的实例属性和实例方法,并不会继承静态属性和静态方法,并且静态方法只能通过类名来调用。
2.3.3 多态
多态的具体表现在方法的重载和重写;
重载:是指不同的函数使用了相同的函数名,但函数的参数个数和类型不同,使用的时候根据参数来确定具体的调用的函数。
重写:也称为覆盖,是指在派生类中重新对类的虚函数重新实现。即函数名称和参数完全一样,只是函数的实现方法不同。
class Son extends Father {
// 重写父类方法
getName() {
console.log('hhhh');
}
}
2.3.4 特点:
(1)封装:把客观事务封装成抽象成的类,隐藏对属性和方法的实现细节,仅对外提供接口。
(2)继承:子类可以使用父类的所有功能,并对这些功能进行扩展。实现代码的复用。
(3)多态:实现了方法的个性化,不同的子类根据具体状况可以实现不同的方法,光有父类定义的方法不够灵活,遇见特殊状况就捉襟见肘了。在调用是,通过指向基类的指针或引用来调用派生类中的虚拟函数来实现多态。
功能介绍:
封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的类。它们的目的都是为了代码重用。
多态则是为了实现另一个目的—接口重用。
面向对象的代码更加支持重用,能降低软件开发和维护的成本,提高软件的质量。
问题:
掌握面向对象的困难之处在于思路的转换。我们通常习惯于考虑解决问题的方法,而不是考虑将问题抽象成对象再去解决它。
举例实现:
例:求长方形的周长和面积
面向过程的程序设计:
- 确定长方形的周长和面积的算法;
- 编写两个方法(函数)分别计算长方形的周长和面积;
- 两个方法均需要两个参数,分别是长方形的款与高。
面向对象的程序设计:
- 一个长方形可以看作是一个长方形对象;
- 一个长方形对象有两个状态(长和宽)和两个行为(求周长和求面积);
- 将所有长方形的共性抽取出来,设计一个长方形类;
- 通过长方形对象的行为,就可以求出某个具体的长方形对象的周长和面积。