JavaScript 继承

26 阅读2分钟

案例

视频网站有两种会员:

  • 普通会员
    • 属性:用户名、密码
    • 方法:观看免费视频
  • VIP会员
    • 属性:普通会员的所有属性、会员到期时间
    • 方法:普通会员的所有方法、观看付费视频

如果我们需要使用构造函数来创建会员,如何书写构造函数才能实现上面的需求?

分析

  • Vip 包含普通会员所有属性,还有自己的属性
  • vip 包含普通会员所有方法,还有自己的方法

思路

普通会员是Vip会员的基类,vip继承普通会员的所有属性和方法

image.png

探讨

代码中出现了大量的重复.

image.png 重复:

  1. 属性有重复的
  2. 方法也有重复的

解决

解决属性重复

方法: 我们将vip构造函数的重复删掉, 直接使用 构造函数User,

问题: 发现它们的this指向不一样 方法: 使用call调整 this的指向

tips: 使用了new操作符, 会隐性的return this, 没有使用new 此时内部的this 是全局的winodw,建议显示return this image.png

解决方法的重复

方法: 直接将 VipUserprototype.__proto__ 指向 User的prototype 将Vip 私有的方法挂载到 vipUser.prototype

这和继承有什么关系

继承是面向对象的概念,它描述了两个对象类型(类,构造函数)之间的关系

如果在逻辑上可以描述为:A不一定是B,但B一定是A,则:B继承A、A派生B、A是B的父类、B是A的子类

子类的实例应该自动拥有父类的所有成员

image.png 继承具有两个特性:

  • 单根性:子类最多只有一个父类
  • 传递性:间接父类的成员会传递到子类中

如何在JS中封装继承

function inherit(Child, Parent){
  // 在原型链上完成继承 
  Object.setPrototypeOf(Child.prototype, Parent.prototype);
}