继承的实现方式之 假借构造函数

基本形式

function Person(name){
    this.name = name;
}
Person.prototype.sayHi = function(){
    console.log(this.name);
}

function Student(name, mark){
    Person.call(this, name);
    this.mark = mark;
}

let student1 = new Student("Jack", 97);
console.log(student1.name, student1.mark); //Jack 97
student1.sayHi(); 
//Uncaught TypeError: student1.sayHi is not a function

 

在子类的构造函数中调用父类的构造函数,并通过call或者aplly使this始终指向创建的子类实例。

 

优点:

  1. 通过借用构造函数,将父类的实例属性直接定义到了子类上,每个子类实例之间不共享
  2. 可以向父类的构造函数传参

缺点:

  1. 无法继承父类的原型上的属性和方法
  2. 由于1,所有需要继承的方法都必须定义在构造函数中,不能实现函数的复用
  3. 没有形成原型链,创建的实例只是子类的实例不是父类的实例。在子类实例和父类原型之间使用instanceof或isPropertypeOf会返回false。
posted @ 2020-07-15 06:36  studystudyxinxin  阅读(105)  评论(0)    收藏  举报