IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Es5的几种继承方式 -> 正文阅读

[JavaScript知识库]Es5的几种继承方式

1. 原型链继承 (子类的原型等于父类的实例

            <!-- 父类 -- >
            function Super(name) {
                this.name = name
            }
            Super.prototype = {
                name: '我要走走看看',
                age: 18,
                hobby: { a: '篮球' },
            }
             <!-- 子类 -- >
            function Sub() {}

            Sub.prototype = new Super() // 子类的原型等于父类的实例

            const sub = new Sub()
            console.log(sub.age) // 18

缺点:

1. 子类无法想父类的构造函数传参.??new Sub( name )父类也接收不到

2. 子类修改父类原型中引用类型的值时,原型的属性发生改变,导致之后的实例的值都发生改变

注:给变量赋值,是引用还是复制

            const sub1 = new Sub()
            const sub2 = new Sub()
            sub1.hobby.a = '羽毛球'  // 这里修改了sub1的hobby的值
            console.log(sub1.hobby) // { a: '羽毛球' }
            console.log(sub2.hobby) // { a: '羽毛球' }

2.借用构造函数继承?

通过 call 、apply将父类构造函数的方法引入子类

            // 父类
            function Super(name) {
                this.name = name
            }
            Super.prototype = {
                name: '我要走走看看',
                age: 18,
                hobby: { a: '篮球' },
            }
            // 子类
            function Sub(name) {
                Super.call(this,name)// 通过  call / apply 继承父类构造函数内的属性和方法
            }
            const sub = new Sub('猫咪')
            console.log(sub.name)  // 猫咪
            console.log(sub.age)   // undefined

优点 :1. 解决了子类实例向父类传参的缺点?

? ? ? ? ? ? 2.解决了子类实例修改父类原型属性或者方法的问题

? ? ? ? ? ? 3.?可以继承多个构造函数属性(call多个)。

缺点: 1. 无法继承父类原型的方法和属性

? ? ? ? ? ? 2.?每个新实例都有父类构造函数的副本,无法复用,臃肿。

3. 组合继承 (j原型链继承 + 构造函数继承 )

            // 父类
            function Super(name) {
                this.name = name
            }
            Super.prototype = {
                name: '我要走走看看',
                age: 18,
                hobby: { a: '篮球' },
            }
            // 子类
            function Sub(name) {
                Super.call(this,name)   // 1: 调用第一次
            }
            Sub.prototype = new Super() // 2: 调用第二次

?优点:可传参 + 继承了父类的原型

?缺点:两次调用父类的构造函数(耗内存)

4. 原型式继承

            function Super(name) {
                this.name = name
            }
            Super.prototype.sayName = function() {
                console.log(this.name)
            }
            const a = new Super('姓名')

            <!---这里相当于Object.create()做的事,将 现有对象 作为 新对象的原型 --->
            function inherit(o) {
                function F() {}
                F.prototype = o
                return new F()
            }
            const b1 = inherit(a)
            <!-------->
            
            console.log(b.name) // 姓名

上述注释中的代码类似于

 const b1 = Object.create(a)

用Object.create更好一点,还可以加上额外的属性

          const b1 = Object.create(a, {
                age: {
                    value: 15,
                    writable: true,
                },
                address: {
                    value: '上海',
                    writable: true,
                },
            })

缺点 :无法复用,原型都是手动添加上去的? ?

5 . 寄生组合式继承(常用)

            function Super(name) {
                this.name = name
                this.age = 21
            }
            Super.prototype = Object.assign({
                sayName: () => {
                    console.log(this.name)
                },
                address: '上海',
                hobby: ['唱歌'],
            })

            function Sub(name) {
                Super.call(this, name) // 继承父类构造函数的属性
            }
            Sub.prototype = Object.create(Super.prototype) // 继承父类的原型
            const sub1 = new Sub('姓名1')
            console.log(this.name) // 姓名1

优点 :既可以传参又实现了原型的复用? ? ??

?

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:20:07  更:2022-02-28 15:22:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:00:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码