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

JS面试题5——JS继承有哪些方式

1. ES6

子类构造方法中必须调用super方法,且只有在调用了super()之后才能使用this。

因为子类的this对象是继承父类的this对象,然后对其加工,而super方法表示的是父类的构造函数,用来新建父类的this对象。

/* 此时的Child上只有name属性,没有age属性 */
<script>
// 父
class Parent{constructor(){this.age = 18;}
}
// 子
class Child{constructor(){this.name = '张三';}
}
let o1 = new Child();
console.log(o1, o1.name, o1.age); // 打印出:Child {name: '张三'} '张三' undefined
</script>
/* 此时的Child上既有name属性,又有age属性 */
<script>
// 父
class Parent{constructor(){this.age = 18;}
}
// 子
class Child extends Parent{constructor(){super();this.name = '张三';}
}
let o1 = new Child();
console.log(o1, o1.name, o1.age); // 打印出:Child {age: 18, name: '张三'} '张三' 18
</script>

2. 原型链继承

优点:写法方便简洁,容易理解

缺点:对象实例共享所有继承的属性和方法,无法向父类构造函数传参

<script>
// 父
function Parent() {this.age = 20;
}
// 子
function Child() {this.name = '李四';
}
Child.prototype = new Parent()
let o1 = new Child();
console.log(o1, o1.name, o1.age); // 打印出:Child {name: '李四'} '李四' 20
</script>

3. 借用构造函数继承

优点:解决了原型链继承中不能传参的问题以及父类的原型共享的问题

缺点:方法都在构造函数中定义,无法实现函数复用;在父类的原型中定义的方法,对子类而言是不可见的,结果所有类型都只能使用构造函数模式。

<script>
// 父
function Parent(){this.age = 22;
}
// 子
function Child(){this.name = 'xiongxinyu';Parent.call(this); // 改变this指向
}
let o3 = new Child();
console.log(o3,o3.name,o3.age); // 打印出:Child {name: 'xiongxinyu', age: 22} 'xiongxinyu' 22
</script>

4. 组合式继承

优点: 解决了原型链继承和借用构造函数继承造成的影响

缺点:无论在什么情况下,都会调用两次父类构造函数(一次是在创建子类原型的时候,一次是在子类构造函数内部)

<script>
// 父
function Parent(){this.age = '24'
}
// 子
function Child(){Parent.call(this)this.name = 'y'
}
Child.prototype = new Parent();
var o4 = new Child();
console.log(o4,o4.name,o4.age); // 打印出:Child {age: '24', name: 'y'} 'y' '24'
</script>

相关文章:

  • Android studio Logcat 功能介绍
  • springboot中使用springboot cache
  • iOS端授权页添加自定义按钮
  • android 是Application类先运行还是AndroidManifest.xml中action先运行?Application类先运行
  • 计算机公共课面试常见问题:线性代数篇
  • 计算机视觉 | 基于图像处理和边缘检测算法的黄豆计数实验
  • TS_开发一个项目
  • 【51单片机】串口通信(发送与接收)
  • uniapp中实现瀑布流 短视频页面展示
  • python3递归目录删除N天前的文件(带有日志记录)
  • RabbitMQ中java实现队列和交换机的声明
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • 大数据面试题之HBase(1)
  • LabVIEW遇到无法控制国外设备时怎么办
  • 学生管理系统
  • $translatePartialLoader加载失败及解决方式
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • android 一些 utils
  • Android框架之Volley
  • Asm.js的简单介绍
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Consul Config 使用Git做版本控制的实现
  • GitUp, 你不可错过的秀外慧中的git工具
  • Hibernate【inverse和cascade属性】知识要点
  • Laravel 菜鸟晋级之路
  • log4j2输出到kafka
  • nodejs实现webservice问题总结
  • node和express搭建代理服务器(源码)
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Terraform入门 - 1. 安装Terraform
  • Vue.js源码(2):初探List Rendering
  • Webpack 4 学习01(基础配置)
  • Web标准制定过程
  • 京东美团研发面经
  • 经典排序算法及其 Java 实现
  • 详解移动APP与web APP的区别
  • 用简单代码看卷积组块发展
  • Android开发者必备:推荐一款助力开发的开源APP
  • Prometheus VS InfluxDB
  • ​io --- 处理流的核心工具​
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • $nextTick的使用场景介绍
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (02)vite环境变量配置
  • (LeetCode 49)Anagrams
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (七)Java对象在Hibernate持久化层的状态
  • (小白学Java)Java简介和基本配置
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)nsfocus-绿盟科技笔试题目
  • **CI中自动类加载的用法总结