面向对象编程介绍

面向过程编程POP(Process-oriented programming):分析出解析问题所需要的步骤,然后用函数把这些步骤一步步实现,使用的时候在一个一个一次调用。

面向对象编程OOP(Object Oriented Programming):面向对象是把事务分解成为一个个对象,然后由对象之间分工合作。以对象功能来划分问题,而不是步骤。

面向对象编程具有灵活、代码可复用、容易维护和开发的优点

特性:

  • 封装性
  • 继承性
  • 多态性

思维特点:

1、抽取(抽象)对象共有的属性和行为组织(封装)成一个类(模板)

2、对对象进行实例化,获取类的对象

在JavaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象

  • 属性:事物的特征
  • 方法:事物的行为

ES6中的类和对象

在ES6中新增了类的概念,可以使用class关键字声明一个类,之后以这个类来实例化一个对象。

// 创建类
class People {
	// 类的共有属性放在constructor中
    constructor(name) {
        this.name = name;	// this指向创建的实例对象
    }
    // 方法
    say(text) {
        // 方法中的this指向方法的调用者
        console.log(this.name + text);
    }
}
// 利用类创建对象
let uzi = new People('乌兹');
console.log(uzi.name);	// '乌兹'

uzi.say("永远滴神!");	// 乌兹永远的神!
  • 通过class关键字创建类,类名习惯大写
  • 类中有一个constructor函数,可以接受传递过来的参数,同时返回实例对象
  • constructor函数 只要new生成实例时,就会自动调用,如果不写这个函数,类也会自动生成这个函数
  • 生成实例new不能省略
  • 创建类,类名后不要加小括号,构造函数不需要加function
  • ES6中类没有变量提升,必须先定义类,才能通过类实例化对象
  • 类里的共有属性和方法一定要加this使用

类的继承

super关键字用于访问和调用对象父类上的函数。可以调用父类的构造函数,也可以调用父类的普通函数

// 父类
class Father {
    constructor(x,y) {
        this.x = x;
        this.y = y;
    }
    money() {
        console.log(100);
    }
    sum() {	// 父类方法必须使用父类中的参数
        console.log(this.x + this.y);	
    }
    say() {
        console.log("小头爸爸");
    }
}
// 子类继承父类
class Son extends Father {
    constructor(x,y) {
        // 调用了父类的构造函数
        super(x,y);	 // 相当于Father.call(this, x, y)
        // super必须在子类this之前调用
        this.x = x;
        this.y = y;
    }
    // 重新父类方法
    say() {
        console.log("大头儿子");
    }
    fatherSay() {
        console.log(super.say());	// 调用父类的函数
    }
}
let son = new Son(1,2);
// 继承中,如果实例化子类输出一个方法,先看看子类有没有这个方法,如果有先执行子类的,如果没有就去查找父类(就近原则)
son.money(); // 100
son.sum(); 	// 3
son.say(); 	// 大头儿子
son.fatherSay(); // 小头爸爸

类的本质

类的本质还是一个函数,可以认为类就是构造函数的另外一种写法

class People {
    
}
typeof People; // function
  1. 类有原型对象

    People.prototype;
  2. 类的原型对象中的构造函数指向类本身

    People.prototype.constructor === class People {}
  3. 类可以通过原型对象添加方法

    People.prototype.say = function() {
        console.log('112');
    }
    // 使用Object.assign一次性添加多个方法
    Object.assign(People.prototype, {
        sayName() {
            return this.name
        },
        sayAge() {
            return this.age
        }
    })
  4. 类创建的实例中也有对象原型__proto__,指向类的原型对象

    let uzi = new People();
    uzi.__proto__ === People.prototype;

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

构造函数与原型 上一篇
ES6中Set的使用 下一篇