面向对象编程
什么是面向对象
面向对象是以对象功能来划分问题
在面向对象程序开发思想中,每一个对象都是功能中心,具有明确分工
面向对象具有零活、代码可复用、容易维护和开发的优点
面向对象的特性
- 封装性
- 继承性
- 多态性
面向过程和面向对象的对比
面向过程
- 优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用面向过程编程
- 缺点:没有面向对象易维护、易复用、易扩展
面向对象
- 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,使系统更加零活、更加易于维护
- 缺点:性能比面向过程低
面向对象的思维特点
- 抽取(抽象)对象共用的属性和行为组织(封装)成一个类(模板)
- 对类进行实例化,获取类的对象
面向对象编程我们考虑的是有哪些对象,按照面向对象的思维特点,不断地创建对象,使用对象,指挥对象做事情
对象
对象的概念
在JavaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等
对象是由属性和方法构成的
- 属性:事物的特征,在对象中用属性来表示(常用名词)
- 方法:事物的行为,在对象中用方法来表示(常用动词)
类 class
在es6中新增了类的概念,可以使用class关键字声明一个类,之后以这个类来实例化对象
类抽象了对象的公共部分,它泛指某一大类
对象特指某一个,通过类实例化一个具体的对象
语法
//创建类
class name = {
// class body
constructor(uName,age){
this.uName = uName
this.age = age
}
}
//创建实例 使用类创建对象
var tom = new name('Tom',18)
// tom:{
// name:'Tom',
// age:18
//}
类constructor构造函数
使用new关键字创建对象的时候 会自动调用类的constructor函数
可以接收传递过来的参数,同时返回实例对象
JS继承,super关键字
使用extends关键字继承
//父类
class Father {
constructor(x,y){
this.x = x
this.y = y
}
sum(){
console.log(this.x + this.y)
}
}
//子类继承父类
class Son extends Father {
constructor(x,y){
this.x = x //这时候的this指向的是Son
this.y = y
}
}
let son = new Son(1,2)
son.sum() //会报错,此时的this指向的是子类,但是调用得父类sum方法中的this指向的是父类
//解决 使用super关键字
class Son extends Father{
constructor(x,y){
super(x,y) //super相当于调用了父类的构造函数
}
}
super调用父类普通函数
//父类
class Father {
say(){
return '我是爸爸'
}
}
//子类
class Son extends Father {
say(){
console.log(super.say()) //输出结果 我是爸爸
}
}
继承中的属性或者方法查找原则:就近原则
继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就执行子类的
继承中,如果子类里面没有,就去查找父类有没有这个方法,如果有,就执行父类的这个方法(就近原则)
注意:子类在构造函数中使用super,必须放到this前面(必须先调用父类的构造方法,在使用子类构造方法)
class Father {
constructor(x,y){
this.x = x
this.y = y
}
sum(){
return this.x + this.y
}
}
class Son extends Father {
constructor(x,y){
super(x,y) //在this之前使用
this.x = x
this.y = y
}
subtraction(){
return this.x - this.y
}
}
在ES6中类没有变量提升,所以必须先定义类,才能通过类实例化对象
类里面的共有属性和方法一定要加this使用
this指向问题
constructor中this指向的是创建实例的对象
类中方法中的this指向调用者
<button id='btn'></button>
<script>
var that
class Star {
constructor(uname,age){
that = this
this.uname = uname
this.age = age
this.btn = document.getElementbyId('btn')
this.btn.onclick = this.sing
}
sing(){
console.log(that.uname) //that里面存储的是constructor的this
}
}
</script>