js继承

问题场景 假设我们有一个父构造函数People和子构造函数Student, People有一个age属性和一个getAge方法, student有一个num属性和一个getNum方法,如下

function People(age){
  this.age = age
}
People.prototype.getAge = () => {console.log(this.age)} //错误示例 给构造器添加方法不能使用箭头函数,会使this恒指向构造函数,正常情况this指向创建的实例对象
People.prototype.getAge = function(){console.log(this.age)}

function Student (num){
  this.num = num
}
Student.prototype.getNum = function{console.log(this.num)}

实现Student继承People

继承父类的属性

在一个子构造函数中,可以通过调用父构造函数的call方法来实现继承,类似java.使用Student创建的对象实例都会拥有People构造函数中的添加的age属性.

 function Student(age,num){
   this.num = num
   People.call(age,this)

 }

利用原型机制,将子构造函数的原型属性设置为父构造函数的实例

function Student(num){
  this.num=num
}
Student.prototype = new People() //
Student.prototype.getNum = function{console.log(this.num)}
let Stu1 = new Student('123)

这样基本实现了我们的需求,但是有以下缺点

  1. 子类无法继承父类的实例属性
  2. 会将父类的实例属性,扩展到子类的原型上
  3. 修改子类的原型属性,会导致在Stu1上获取constructor属性为People,而不是Student

使用深拷贝实现继承

let Student = Object.assign({},new Pelple) // 只继承父类的属性,继承属性和不可枚举属性无法继承
let Student = Object.create(People.prototype) // 继承父类的方法

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容