原型继承和 Class 继承
涉及面试题:
- 原型如何实现继承?
- Class 如何实现继承?
- Class 本质是什么?
⾸先先来讲下 class ,其实在 JS 中并不存在类, class 只是语法糖,本质还是函数。
class Person {}
Person instanceof Function // true
组合继承 --- 组合继承是最常⽤的继承⽅式。
function Parent(value) {
this.val = value
}
Parent.prototype.getValue = function() {
console.log(this.val)
}
function Child(value) {
Parent.call(this, value)
}
Child.prototype = new Parent()
const child = new Child(1)
child.getValue() // 1
child instanceof Parent // true
- 以上继承的⽅式核⼼是在⼦类的构造函数中通过 Parent.call(this) 继承⽗类的属性, 然后改变⼦类的原型为 new Parent() 来继承⽗类的函数。
- 这种继承⽅式优点在于构造函数可以传参,不会与⽗类引⽤属性共享,可以复⽤⽗类的函数,
- 但是也存在⼀个缺点就是在继承⽗类函数的时候调⽤了⽗类构造函数,导致⼦类的原型上多了不需要的⽗类属性,存在内存上的浪费。
寄⽣组合继承 --- 这种继承⽅式对组合继承进⾏了优化,组合继承缺点在于继承⽗类函数时调用了构造函数,我们只需要优化掉这点就⾏了。
function Parent(value) {
this.val = value
}
Parent.prototype.getValue = function() {
console.log(this.val)
}
function Child(value) {
Parent.call(this, value)
}
Child.prototype = Object.create(Parent.prototype, {
constructor: {
value: Child,
enumerable: false,
writable: true,
configurable: true
}
})
const child = new Child(1)
child.getValue() // 1
child instanceof Parent // true
- 以上继承实现的核心就是将⽗类的原型赋值给了子类,并且将构造函数设置为子类,这样既解决了无用的⽗类属性问题,还能正确的找到子类的构造函数。
Class 继承 --- 以上两种继承方式都是通过原型去解决的,在 ES6 中,我们可以使⽤ class 去实现继承,并且实现起来很简单。
class Parent {
constructor(value) {
this.val = value
}
getValue() {
console.log(this.val)
}
}
class Child extends Parent {
constructor(value) {
super(value)
this.val = value
}
}
let child = new Child(1)
child.getValue() // 1
child instanceof Parent // true
- class 实现继承的核心在于使用 extends 表明继承⾃哪个⽗类,并且在子类构造函数中必须调⽤ super ,
因为这段代码可以看成 Parent.call(this, value) 。
原型继承和 Class 继承的更多相关文章
- javascript实现继承3种方式: 原型继承、借用构造函数继承、组合继承,模拟extends方法继承
javascript中实现继承的三种方式:原型继承.借用构造函数继承.混合继承: /* js当中的继承 js中 构造函数 原型对象 实力对象的关系: 1 构造函数.prototype = 原型对象 2 ...
- 三张图搞懂JavaScript的原型对象与原型链 / js继承,各种继承的优缺点(原型链继承,组合继承,寄生组合继承)
摘自:https://www.cnblogs.com/shuiyi/p/5305435.html 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__pro ...
- HTML5学习笔记(十六):原型、类和继承【JS核心知识点】
理解原型 在JavaScript中,只要声明了一个函数,就会为该函数创建一个名为prototype的属性,该属性指向当前函数的原型对象. 而函数的原型对象有一个constructor属性,该属性指向刚 ...
- javascript精髓篇之原型链维护和继承.
一.两个原型 很多人都知道javascript是原型继承,每个构造函数都有一个prototype成员,通过它就可以把javascript的继承演义的美轮美奂了. 其实啊,光靠这一个属性是无法完成jav ...
- 明白JavaScript原型链和JavaScrip继承
原型链是JavaScript的基础性内容之一.其本质是JavaScript内部的设计逻辑. 首先看一组代码: <script type="text/javascript"&g ...
- JS高级. 03 混入式继承/原型继承/经典继承、拓展内置对象、原型链、创建函数的方式、arguments、eval、静态成员、实例成员、instanceof/是否在同一个原型链
继承:当前对象没有的属性和方法,别人有,拿来给自己用,就是继承 1 混入式继承 var I={ }; var obj = { name: 'jack', age:18, sayGoodbye : fu ...
- JavaScript ES5类 原型 原型链 组合、原型、寄生式继承
ES5类 原型 原型链 继承 JavaScript中,原型是相对于构造函数(类)的叫法(或者说概念),原型链是相对于构造函数(类)的实例对象的叫法. 对于JavaScript对象,如果在对象自身上找 ...
- c++ 接口继承和实现继承
所谓接口继承,就是派生类只继承函数的接口,也就是声明:而实现继承,就是派生类同时继承函数的接口和实现. 我们都很清楚C++中有几个基本的概念,虚函数.纯虚函数.非虚函数. 虚函数: 虚函数是指一个类中 ...
- 深入浅出javascript(十二)继承——构造函数继承和组合继承
#题记: 有一水果类,抽象出属性包括:name(水果品种),price(价格),id(ID号).现有两个子类,分别为苹果,桔子,希望继承水果父类. 一.构造函数继承 构造函数继承相当把父类的属性在子类 ...
- JavaScript 继承——三种继承方法及其优劣
原文地址 本文内容 目的 继承的第一步--最简单的继承 私有变量/成员和原型 三种继承方式及其优劣 基本的原型继承 Yahoo JavaScript 模块模式 创建闭包的构造函数 三种方法的代码执 ...
随机推荐
- Importing the multiarray numpy extension module failed
使用pyinstall打包含有numpy库的可执行程序后运行报错:Importing the multiarray numpy extension module failed 解决方法:卸载使用pip ...
- Jetpack compose学习笔记之ConstraintLayout(布局)
一,简介 Jetpack compose中没有提供ConstraintLayout支持,所以需要添加下面的依赖来导入. // build.gradle implementation "and ...
- vscode 自用插件
Auto Rename Tag 自动配对标签,一同更改: 这个还是比较推荐吧,需要修改的时候只用改第一个,闭合的那一头自动跟着修改了. Quokka ...
- uniapp相关
1.uniapp官网 网址:https://uniapp.dcloud.net.cn/ 2.引入组件库 网址:https://www.uviewui.com/ 3.问题如下 (1)使用SwipeAct ...
- 创建sqlSession对象操作数据库
1.加载核心配置文件 //加载mybatis核心配置文件,获取SqlSessionFactory String resource = "mybatis-config.xml"; I ...
- 个人IDEA常用快捷键
1. Ctrl 快捷键 说明 Ctrl + P 在方法参数括号内显示参数类型提示 Ctrl + Q 显示类或方法的文档注释相关信息 Ctrl + D 复制当前行 Ctrl + Y 删除当前行 Ctrl ...
- mysql索引的面试常问问题
- toString能转换number类型吗
let num = 60console.log(toString(num)) // [object Undefined] console.log(String(num)) // 60
- Zookeeper分布式服务
Zookeeper(CP) 以集群的方式[leader和follower]为分布式应用提供协调服务.负责存储和管理大家都关系的数据,接受观察者注册.消息分发等服务 特点: 只要有半数以上的节点存活就能 ...
- Q:oracle锁表如何处理
解决ORA-00054资源正忙的问题 有时候在drop表或者其他对象的时候,会遇到ORA-00054:资源正忙,要求指定NOWAIT(中文字符集)或者ORA-00054: resource busy ...