面向对象编程介绍
面向过程编程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
类有原型对象
People.prototype;
类的原型对象中的构造函数指向类本身
People.prototype.constructor === class People {}
类可以通过原型对象添加方法
People.prototype.say = function() { console.log('112'); } // 使用Object.assign一次性添加多个方法 Object.assign(People.prototype, { sayName() { return this.name }, sayAge() { return this.age } })
类创建的实例中也有对象原型
__proto__
,指向类的原型对象let uzi = new People(); uzi.__proto__ === People.prototype;
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!