继承知识点

纸飞机 发表于 2021/10/18 22:41:12 2021/10/18
【摘要】 1、原型链继承 将子类(构造函数)的原型 指向父类(构造函数)的实例。 function Father() { this.name = 'Fname'; this.likes = ['read', 'travel'];}Father.prototype.getName = function() { return t...

1、原型链继承

将子类(构造函数)的原型 指向父类(构造函数)的实例。


  
  1. function Father() {
  2. this.name = 'Fname';
  3. this.likes = ['read', 'travel'];
  4. }
  5. Father.prototype.getName = function() {
  6. return this.name
  7. }
  8. function Son(age) {
  9. this.age = age
  10. }
  11. //重写子类原型使其指向父类的实例
  12. Son.prototype = new Father();
  13. //需之后添加原型方法,否则会被重写覆盖
  14. Son.prototype.getAge = function(){
  15. return this.age
  16. }
  17. var son1 = new Son(20)
  18. //顺着原型链可访问父类属性及原型方法
  19. console.log(son1.name) // Fname
  20. console.log(son1.getName()) //Fname

缺点:

⑴ 原型中的所有属性被所有实例共享 ,如有更改 ,引用类型会互相影响 ,基本类型会在实例中新创建,对原型无影响。


  
  1. var son2 = new Son(16)
  2. son1.name = 'Sname';
  3. son1.likes.push('eat');
  4. son2.name //Fname
  5. son2.likes //["read","travel", "eat"]
  6. son1.name //Sname
  7. son1.likes //["read","travel", "eat"]

⑵创建子类实例时,无法向父类构造函数传参,使不同的子类实例拥有不同的父类属性值, 例如让每个子类实例拥有各自的name值和likes值。虽然在创建父类的实例时可以传一次参, 但得到的是共享的属性值。

原型链继承

2、借用构造函数继承

使用call或apply 在子类构造函数中调用父类构造函数。


  
  1. //解决引用类型共享问题,每个子类实例拥有自己的属性
  2. function Father() {
  3. this.arr = [1,2,3]
  4. }
  5. function Son() {
  6. Father.call(this)
  7. }
  8. var son1 = new Son()
  9. var son2 = new Son()
  10. son2.arr.push(4)
  11. console.log(son2.arr) //[1,2,3,4]
  12. console.log(son1.arr) //[1,2,3]

  
  1. //解决传参问题:每个子类实例继承了父类属性且拥有各自的值
  2. function Father(name) {
  3. this.name = name
  4. }
  5. function Son(name) {
  6. Father.call(this, name)
  7. }
  8. var son1 = new Son("aa")
  9. console.log(son1.name) //aa
  10. var son2 = new Son("bb")
  11. console.log(son2.name) //bb

缺点:

如果方法都在构造函数中定义,没有了 函数复用性。每个实例都创建了一份函数副 本,占资源。

3、组合继承(常用) 

原型链+借用构造函数。共享的方法和属性通过原型链继承, 实例各自的属性通过借用构造函数继承。


  
  1. function Father(name) {
  2. this.name = name
  3. this.arr = [1,2,3]
  4. }
  5. Father.prototype.getName = function() {
  6. console.log(this.name)
  7. }
  8. function Son(name, age) {
  9. Father.call(this, name)
  10. this.age = age
  11. }
  12. Son.prototype = new Father()
  13. Son.prototype.constructor = Son
  14. Son.prototype.getAge = function() {
  15. console.log(this.age)
  16. }
  17. var son1 = new Son("xiao",20)
  18. son1.arr.push(4)
  19. console.log(son1.arr) //[1,2,3,4]
  20. son1.getName() //xiao
  21. son1.getAge() //20
  22. var son2 = new Son("lulu", 16)
  23. console.log(son2.arr) //[1,2,3]
  24. son2.getName() //lulu
  25. son2.getAge() //16

组合继承


 除此还有原型式继承寄生式继承寄生组合式继承

文章来源: root181.blog.csdn.net,作者:前端纸飞机,版权归原作者所有,如需转载,请联系作者。

原文链接:root181.blog.csdn.net/article/details/119855931

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。