当前位置: 首页 > news >正文

【js基础】继承(原型链继承、组合式继承、寄生组合式继承、class的实现)

1、原型链继承
缺点:
(1)父类引用类型属性会被子类所有实例共享(改一个全变)
(2)子类不能给父类传参

// 原型链继承 function Parent() { this.name = 'parent' this.arr = [1,2,3] // 引用类型!坑点 } function Child(){} Child.prototype = new Parent(); let c1 = new Child(); let c2 = new Child(); c1.arr.push(4); console.log(c1.arr, c2.arr)

2、构造函数继承

缺点:
(1)方法在构造函数中,每个实例都会创建一遍,无法复用
(2)原型上的属性、方法不能继承

function Parent(name) { this.name = name; this.arr = [1,2,3] // 引用类型!坑点 } function Child(name){ Parent.call(this, name) } let c1 = new Child('宏宏'); let c2 = new Child('兰兰') console.log(c1.name) c1.arr.push(4); console.log(c1.arr, c2.arr)

3、组合继承,结合上面两种
缺点:
(1)2次调用父类构造函数、有性能问题
(2)子类原型上的属性,是冗余的,实例在构造函数中已经创建了自己的属性

function Parent(name) { this.name = name; this.arr = [1,2,3] // 引用类型!坑点 } Parent.prototype.say = function() { console.log('say hi') } function Child(){ Parent.call(this) } Child.prototype = new Parent(); let c1 = new Child('宏宏'); let c2 = new Child('兰兰')

4、原型继承
缺点和原型链继承一样

const person = { name: "张三", colors: ["红", "绿", "蓝"], // 引用类型!坑点 say() { console.log(this.name); } }; // 2. 使用原型式继承,创建新对象 const p1 = Object.create(person); p1.say()

5、寄生继承
寄生继承 在原型继承基础上增添一些方法

6、组合寄生式继承

function Parent() { this.name = 'parent' } Parent.prototype.say = function() {} function Child() { Parent.call(this) // 1次 } // 核心:继承父类原型,不调用父构造函数 Child.prototype = Object.create(Parent.prototype) Child.prototype.constructor = Child // 修复指向

7、class继承(实际就是组合寄生的语法糖)

class Parent {} class Child extends Parent { constructor() { super() // 相当于 Parent.call(this) } }

8、常见面试问答
(1)说说js继承的理解
答:js继承是基于原型链的继承,而不是基于类的继承。每个实例都有_proto_属性,每个构造函数都有prototype,每个实例的_proto_指针指向构造函数的原型,查找属性、方法时会向上查找,直到找到null。(结合原型链概念来说)
(2)为什么不能直接用Child.prototype = Parent.prototype

答:因为原型是引用类型,直接赋值会污染父类,所有实例都会有影响。

(3)Object.create()的作用是什么?

答:创建一个空对象,使七_proto_属性指向传入的参数。

(4)继承中constructor为什么要修正?

答:不修正构造函数是Parent

(5)Object.create (null) 和 {} 有什么区别?继承关系有什么不同?
答:{}的_proto_指向Object.prototype,有Object的方法在上面,null的_proto_属性是undefined,没有原型链。

(6)如何实现一个 “继承”,既能继承属性,又不污染原型?

function inherit(child, parent) { let prototype = Object.create(parent.prototype); prototype.constructor = child; child.prototype = prototype; }

(7)用代码还原 ES6 继承底层

// 父类 function Parent(name) { this.name = name; } Parent.prototype.say = function () {} // 子类 function Child(name, age) { // 3. 调用父类创建 this Parent.call(this, name); this.age = age; } // 1. 子类 __proto__ 指向父类(继承静态属性) Child.__proto__ = Parent; // 2. 子类原型继承父类原型 Child.prototype = Object.create(Parent.prototype); Child.prototype.constructor = Child;
http://www.jsqmd.com/news/551173/

相关文章:

  • SWAT建模(学习中)
  • 什么是大模型投毒?大模型投毒原理、路径和案例剖析
  • 告别论文焦虑:Paperxie 如何用四大降重神器搞定毕业论文重复率与 AIGC 率
  • 为你的员工考核提供25个聪明的绩效考核问题
  • 爱芯元智上市后首次年报:营收5.6亿同比增19% 智能汽车业务成增长引擎
  • 终极资源下载神器:res-downloader 全网视频音频一键获取完整指南
  • Keil魔术棒里这10个配置,搞懂一半你就能超越80%的嵌入式新手
  • 数据模型与指标模型有什么区别?一文讲清
  • 深入解析CSS2盒子模型:三大布局技巧与两大空白问题解决方案
  • 想转行AI行业?从入门到精通,掌握人工智能的核心技能!非常详细收藏我这一篇就够了
  • 大模型技能加持!运维工程师薪资飙升53%,AI架构师跃迁秘籍大公开!
  • 2026年3月进口户外漆厂家推荐,进口户外木漆、木器漆、防水漆、地面漆、金属漆、庭院栅栏漆、水性户外漆,长效耐候防腐实力源头厂商 - 品牌企业推荐师(官方)
  • Web渗透测试之密码找回漏洞实战心得体会
  • 面向 iOS 蓝牙开发者的“蓝牙地图”
  • 51单片机实战手记8 -- 超声波避障小车
  • 3个维度彻底解决磁盘空间失控问题:Czkawka技术原理与实战指南
  • 告别命令行:用Docker Compose一键部署Ollama WebUI可视化界面(含汉化配置)
  • Python与Rust混合编程实战:用PyO3让你的代码快10倍
  • 个人作品集展示的最佳实践与工具选择
  • MusePublic风格迁移教程:将经典画作风格注入现代人像生成
  • FlexASIO配置终极指南:解决音频延迟与音质问题的完整解决方案
  • 3个核心价值:FunClip的高效实践全流程指南
  • 企业号码认证服务商对比:实现手机/座机来电显示LOGO与企业名称 - 企业服务推荐
  • AI产品经理崛起:技术人转型的新风口
  • MTK Android12 设备去掉 Modem 完整方案(WiFi-Only 设备)
  • AS5050A磁性旋转编码器SPI驱动开发与工程实践
  • Umi-OCR终极指南:免费离线OCR工具让图片文字提取变得如此简单
  • Spring Boot 与 OpenTelemetry 链路追踪实战
  • 2025_NIPS_Optimizing the Unknown: Black Box Bayesian Optimization with Energy-Based Model and Reinfo
  • 2026年3月二手装载机厂家推荐:二手50装载机、徐工柳工装载机出口选型指南,实力源头厂商精选 - 品牌企业推荐师(官方)