继承的理解

什么是继承 ?

继承:从别人哪里,继承东西过来(财产,房产)

代码层面相当于:继承一些属性和方法

继承的作用:可以让多个构造函数之间建立关联,便于管理和复用

继承 - 原型继承

原型继承:通过改造原型链,利用原型链的语法,实现继承方法

比如:

  人类属性:name,age

  学生属性:name,age,className

  工人属性:name,age,companyName

无论学生,还是工人,都是人类,所以人类原型上有的方法,他们都应该有

实现方案:将学生构造函数自己的原型对象的地址断开,指向人类实例对象,从而继承人类的原型对象的属性和方法

继承 - 组合继承

组合继承有时候也叫伪经典继承,指的是将原型链和借用构造函数call技术组合到一起

从而发挥二者之长的一种继承模式,器背后的思路:使用原型链实现对原型属性和方法的继承

而通过借用构造函数来实现对实例属性构造的继承。这样既通过在原型上定义方法实现函数的复用,有保证每个实例都有它自己的属性。

方法通过:原型继承

属性通过:借调,父构造函数的.call()

// 1. 定义Person构造函数
function Person (name, age) {
  this.name = name
  this.age = age
}
Person.prototype.say = function () {
  console.log('人类会说话')
}

// 2. 定义Student构造函数
function Student (name, age, className) {
  Person.call(this, name, age) // 实现构造属性的继承
  this.className = className
}

// 3. 原型继承: 利用原型链, 继承于父级构造函数, 继承原型上的方法
// 语法: 子构造函数.prototype = new 父构造函数()
Student.prototype = new Person()
Student.prototype.study = function() {
  console.log('学生在学习')
}

let stu = new Student('张三', 18, '80期')
stu.say()
console.log(stu)

// 方法通过 原型继承
// 属性通过 父构造函数的.call(this, name, age)

继承 - 寄生组合继承

当前学生student实例已经有name,age属性,而原型__proto__上应该不再需要这些属性,所以可以利用Object.create进行改造

我们已经在call()借调,继承了人类Person构造里的属性,不需要它再次执行(原型上的属性)

所以我们使用Object.create(参数对象)

  1、Object.create会创建一个新的对象

  2、并且这个新对象的__proto__会指向传入的参数对象(从而实现寄生)

// 1. 定义Person构造函数
function Person (name, age) {
  this.name = name
  this.age = age
}
Person.prototype.say = function () {
  console.log('人类会说话')
}

// 2. 定义Student构造函数
function Student (name, age, className) {
  Person.call(this, name, age)
  this.className = className
}

// 3. 原型继承: 利用原型链, 继承于父级构造函数, 继承原型上的方法
// 语法: 子构造函数.prototype = new 父构造函数()
// 构造函数没有必要执行,我们只需要的是原型链
Student.prototype = Object.create(Person.prototype)
Student.prototype.study = function() {
  console.log('学生在学习')
}

let stu = new Student('张三', 18, '80期')
stu.say()
console.log(stu)


// 总结:
// Object.create() 以参数的对象, 作为新建对象的__proto__属性的值, 返回新建的对象

 

posted @ 2021-04-01 00:14  ShuaiBiZou  阅读(123)  评论(0)    收藏  举报