详解JS面向对象

58 阅读3分钟

面向对象编程

什么是面向对象

面向对象是以对象功能来划分问题

在面向对象程序开发思想中,每一个对象都是功能中心,具有明确分工

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

面向对象的特性

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

面向过程和面向对象的对比

面向过程
  • 优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用面向过程编程
  • 缺点:没有面向对象易维护、易复用、易扩展
面向对象
  • 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,使系统更加零活、更加易于维护
  • 缺点:性能比面向过程低

面向对象的思维特点

  1. 抽取(抽象)对象共用的属性和行为组织(封装)成一个类(模板)
  2. 对类进行实例化,获取类的对象

面向对象编程我们考虑的是有哪些对象,按照面向对象的思维特点,不断地创建对象,使用对象,指挥对象做事情

对象

对象的概念

在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>