1.面向对象与面向编程的比较
1.1 面向对象(oop)
- 面向对象是把事物分解称为一个个对象,然后由对象之间分工与合作,是以对象功能划分问题,而不是步骤
- 特征: 封装性、继承性、多态性
- 优点: 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
- 缺点: 性能比面向过程低
面向对象的思维特点:
- 抽取(抽象)对象共用的属性和行为组织(封装)成一个类(模板)
- 对类进行实例化, 获取类的对象
1.2 面向过程(pop)
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了,面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了
- 优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程。
- 缺点:没有面向对象易维护、易复用、易扩展
2. ES6中的类和对象
在js中,对象是一组无序的相关属性和方法的集合,万物皆对象
对象是由属性和方法组成的:
- 属性: 事物的特征,在对象中用属性来表示
- 方法: 事物的行为,在对象中用方法来表示
在 ES6 中新增加了类的概念,可以使用 class 关键字声明一个类,之后以这个类来实例化对象
类与对象的区别:
- 类抽象了对象的公共部分,它泛指某一大类(class)
- 对象特指某一个,通过类实例化一个具体的对象
2.1 类的创建
语法:
class name {
// 添加属性和方法,也可以再嵌入一个类
class age {},
}
创建实例
let a = new name();
// 类必须使用new实例化对象
2.2 类 constructor 构造函数
constructor() 方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过 new 命令生成对象实例时,自动调用该方法。如果没有显示定义, 类内部会自动给我们创建一个constructor()
语法:
class Person {
constructor(name,age) { // constructor 构造方法或者构造函数
this.name = name;
this.age = age;
}
sayHi() {
console.log('我会唱歌');
}
// 注意,方法之间不需要加逗号。同时函数不需要加function关键字
}
创建实例:
var ldh = new Person('刘德华', 18);
console.log(ldh.name);
ldh.sayHi();
2.3 类的继承
实例:
class Father {
constructor(surname) {
this.surname= surname;
}
say() {
console.log('你的姓是' + this.surname);
}
}
class Son extends Father{ // 这样子类就继承了父类的属性和方法
}
var damao= new Son('刘');
damao.say();
super关键字用于访问和调用对象父类上的函数,可以调用父类的构造函数,也可以调用父类的普通函数
语法:
class Father {
constructor(x,y) {
this.x = x;
this.y = y;
}
sum() {
console.log(this.x + this.y);
}
say() {
return '我是爸爸';
}
}
class Son extends Father{
constructor(x,y) {
// this.x = x;
// this.y = y;
super(x,y); // 调用了父类中的构造函数 ,super必须写在子类this之前调用
// 子类在构造函数中使用super, 必须放到 this 前面 (必须先调用父类的构造方法,在使用子类构造方法)
this.x = x;
this.y = y;
}
say() {
console.log(super.say() + '的儿子'); // 利用super调用父类的函数
}
substract() {
console.log(this.x - this.y);
}
}
var son = new Son(11,2);
console.log(son);
son.say();
son.substract();
son.sum();
2.4 注意点
- 在 ES6 中类没有变量提升,所以必须先定义类,才能通过类实例化对象.
- 类里面的共有属性和方法一定要加this使用.
- 类里面的this指向问题.
- constructor 里面的this指向实例对象, 方法里面的this 指向这个方法的调用者