类和构造函数的区别

487 阅读3分钟

1 类

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

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

1.1 创建类

 class Star {
     constructor(name, age) {
         this.name = name;
         this.age = age;
     }
     sing(){}
     dance(){}
 }                      //创建类
 var xx = new Star()    //实例对象


  • constructor() 方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过 new 命令生成对象实例时,自动调用该方法。如果没有显示定义, 类内部会自动给我们创建一个constructor()
  • 方法之间不能加逗号分隔,同时方法不需要添加 function 关键字。

1.2 类的继承

extends关键字

  class Father {
      constructor(name) {
          this.name = name;
      }
      say() {}
  }
  class Son extends Father {}
  var son = new Son('xx');
  son.name = xx;
  son.say();

通过extends,Son继承了Father的属性和方法。

super关键字

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()
      }
}
var son= new Son(3,4);
son.sum();      //7
  • super 关键字用于访问和调用对象父类上的函数。可以调用父类的构造函数,也可以调用父类的普通函数
  • constructor 里面的this指向实例对象, 方法里面的this 指向这个方法的调用者
  • 子类在构造函数中使用super, 必须放到 this 前面 (必须先调用父类的构造方法,在使用子类构造方法)

2 构造函数

2.1 构造函数简介

在 ES6之前 ,对象不是基于类创建的,而是用一种称为构建函数的特殊函数来定义对象和它们的特征。构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与 new 一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。

 function Father() {}
 var dada = new Father();

2.2 继承

call()

fn.call(thisArg, arg1, arg2, ...) 

thisArg :当前调用函数 this 的指向对象; arg1,arg2:传递的其他参数

通过call() 把父类型的 this 指向子类型的 this ,这样就可以实现子类型继承父类型的属性。

function Person(name, age, sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
}
function Student(name, age, sex, score) {
    Person.call(this, name, age, sex); // 此时父类的 this 指向子类的 this,同时调用这个函数。
    this.score = score;
}
var xx = new Student('黎明', 18, '男', 100);
console.log(xx.age);//18

原型对象继承父亲方法

一般情况下,对象的方法都在构造函数的原型对象中设置,通过构造函数无法继承父类方法。
通过以下三步就可以继承父类方法:

  1. 将子类所共享的方法提取出来,让子类的 prototype 原型对象 = new 父类()
  2. 本质:子类原型对象等于是实例化父类,因为父类实例化之后另外开辟空间,就不会影响原来父类原型对象
  3. 将子类的 constructor 从新指向子类的构造函数

3 类和构造函数的区别

  • class本质还是function.
  • 类的所有方法都定义在类的prototype属性上
  • 类创建的实例,里面也有__proto__ 指向类的prototype原型对象
  • 所以ES6的类它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

4 练习class

写了一个Tab栏,具有切换、添加、删除、修改的功能,有兴趣可以看下duheng678.github.io/class-demo-…