面向对象

优点:易维护、易复用、易扩展。适合多人合作。

缺点:性能比面向过程低。

面向过程

优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机。

缺点:没有面向对象易维护、易复用、易扩展。

面向对象的思维特点

1、抽取(抽象)对象共用的属性和行为封装成一个类。

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

对象

万物皆对象,对象是一个具体的事物。

在JavaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象。例如:字符串、数值、数组、函数等。

对象由属性和方法组成:

属性:事物的特征,在对象中用属性来表示(常用名词)

方法:事物的行为,在对象中用方法来表示(常用动词)

类class

类抽象了对象的公共部分 ,泛指某一大类(class)

对象特指某一个,通过类实例化一个具体的对象。

创建类

语法:

 

class Name {
    //  class body
}

 

创建实例:

 

var xx = new name();

 

例子

// 1、创建类class,创建一个明星类
class Star {

}
// 2、利用类创建对象 new
new Star();

constructor构造函数

constructor()方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过new命令生成对象实例时,自动调用该方法。如果没有显示定义,类内部会自动给我们创建一个constructor()

 

// 1、创建类class,创建一个明星类
class Star {
  constructor( uname,uage ){
    this.name = uname;
    this.age = uage;
  }
  sing(){
    console.log("我会唱歌!")
    console.log(this.name )
  }
}
// 2、利用类创建对象 new
let ldh = new Star( '刘德华' );
let zxy = new Star( '张学友' );

console.log(ldh,zxy);
// 类里面所有的函数不需要写function
// 多个函数方法之间不需要添加逗号分隔
ldh.sing();
zxy.sing();

 

5个小tips:

1、通过class关键字创建类,类名我们还是习惯性定义首字母大写。

2、类里面有个constructor函数,可以接收传递过来的参数,同时返回实例对象。

3、constructor函数只要有new生成实例时,就会自动调用这个函数,如果我们不写这个函数,类也会自动生成这个函数。

4、生成实例new不能忽略

5、最后注意语法规范,创建类 类名后面不要加小括号,生成实例类名后面加小括号,构造函数不需要加function

继承

普通继承

// 子类不加constructor直接调用父类中的方法,可以直接使用
        class Father {
            constructor() {
            }
            money() {
                console.log(100)
            }
        }
        class Son extends Father {

        }
        var son = new Son()
        son.money() // 100

 

继承+传递参数

// 子类不加constructor直接调用父类中的方法,可以直接使用
        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) {
                super(x, y) // super调用了父类中的构造函数,将参数1,2传入父类构造函数的x,y
            }
       // 其实不写constructor也能成功调用
        }
        var son = new Son(1, 2)
      var son2 = new Son(11, 22)
        son.sum() // 3
     son2.sum() // 33

 

super关键字调用父亲普通函数

// super关键字调用父亲普通函数
        // 如果不用super是什么效果  就近原则
        class Father {
            say() {
                console.log('我是爸爸')
            }
        }
        class Son extends Father {
            say() {
                console.log('我是儿子')
            }
        }
        var son = new Son()
        son.say() // '我是儿子'
        // 1、继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的
        // 2、继承中,如果子类里面没有,就去查找父类有没有这个方法,如果有,就执行父类的这个方法(就近原则)

 如果要使用父类的方法

// super关键字调用父亲普通函数
        // 如果要使用父类的方法
        class Father {
            say() {
                return '我是爸爸'
            }
        }
        class Son extends Father {
            say() {
                console.log(super.say() + '的儿子')
            }
        }
        var son = new Son()
        son.say() // '我是爸爸的儿子'

 使用类的注意事项

1、在ES6中类没有变量提升,所以必须先定义类,才能通过类实例化对象

2、类里面的共有属性和方法一定要加this使用

3、类里面的this指向问题

4、constructor里面的this指向的是创建的实例对象,方法里面的this指向这个方法的调用者