Wang's blog Wang's blog
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Wang Mings

跟随大神,成为大神!
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Python爬虫

  • 前端教程

    • 团队规范

    • Project

    • JS

      • Canvas基础
      • 数据结构
      • 树的深度优先遍历与广度优先遍历
      • for in和for of区别
      • ES6-新增特性一览
      • ES6-解构赋值及原理
      • ES6-Object
      • ES6-模块详解
      • ES6-Class
      • ES6-ECMAScript特性汇总
      • 输入URL背后的技术步骤
      • JavaScript与浏览器 - 线程与引擎
      • HTTP跨域解决方案
      • Http 2与Http 1.x比较
      • JavaScript原型
      • JavaScript继承
        • [#](#组合继承) 组合继承
        • [#](#寄生组合继承) 寄生组合继承
        • [#](#通用继承) 通用继承
        • [#](#参考文章) 参考文章
      • JavaScript事件循环
      • 动手实现Promise
      • JS设计模式
      • JS 经典面试题
      • 排序算法
      • 正则表达式
      • MVC、MVP、MVVM区别
      • Array API与V8源码解析
      • 从V8 sort源码看插入排序
    • NodeJS

    • Vue

    • React

    • 效率工具

    • 读书笔记

  • 教程
  • 前端教程
  • JS
wangmings
2022-07-19
目录

JavaScript继承

# # JavaScript继承

在上篇JavaScript原型中,我们理解了原型的来源以及与其相关的constructor、new、prototype概念。下面我们来看看js是如何通过原型来实现面向对象的另外一个特征:继承。另外推荐《JavaScript高级程序设计》,js面向对象章节写的太棒了,层层递进,深入浅出。

# # 组合继承

利用 call 继承父类上的属性,用子类的原型等于父类实例去继承父类的方法。

缺点:调用两次父类Person构造函数,造成性能浪费。

    // 组合继承,也叫经典继承
    function Person(name, languages) {
        this.name = name
        this.languages = languages
    }
    Person.prototype.sleep = function() {  console.log(this.name + ' go to sleep') }
    
    function Developer(name, languages, codeLanguage) {
        // 构造函数内,使得Person实例的属性/方法,不会变成原型共享属性/方法
        Person.call(this, name, languages) // 构造函数终归也是函数
        this.codeLanguage = codeLanguage
    }
    // 继承原型
    // 原型链,使得Person实例拥有的属性/方法,都变成Developer原型的共享属性/方法
    // 单以下这一行代码会有“当属性为引用类型”的bug,所以需要配合上面Person.call
    Developer.prototype = new Person()
    Developer.prototype.constructor = Developer
    
    var jsCoder = new Developer('tom', ['Chinese', 'English'], ['js', 'css'])
    // Developer中没有定义sleep方法,但可以访问到,说明Develper继承了Person
    jsCoder.sleep() // tom go to sleep
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# # 寄生组合继承

用空函数的原型去等于父类原型,再用子类的原型等于干净函数的实例,从而达到消除一次执行Person函数。

    // 寄生组合继承,也是最理想的继承方式
    function Person(name, languages) {
        this.name = name
        this.languages = languages
    }
    Person.prototype.sleep = function() {  console.log(this.name + ' go to sleep') }
    
    function Developer(name, languages, codeLanguage) {
        Person.call(this, name, languages)
        this.codeLanguage = codeLanguage
    }
    
    // 利用空函数中介,实现继承
    Developer.prototype = object(Person.prototype)
    Developer.prototype.constructor = Developer
    function object(origin) { // object函数,等同于ES6中Object.create
        function F(){}
        F.prototype = origin
        return new F()
    }
    
    var jsCoder = new Developer('tom', ['Chinese', 'English'], ['js', 'css'])
    jsCoder.sleep() // tom go to sleep
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# # 通用继承

以上我们能得到一种通用的js继承,而这种方式也是很多js库正在使用的继承函数。

    inheritPrototype(Developer, Person)
    
    function inheritPrototype(subClass, superClass) {
        subClass.prototype = Object.create(superClass.prototype)
        subClass.prototype.constructor = subClass
        // 或者一条代码
        // subClass.prototype = Object.create(superClass && superClass.prototype, {
        //     constructor: { value: subClass, writable: true, configurable: true }
        // });
    }
    
1
2
3
4
5
6
7
8
9
10
11

# # 参考文章

  • avascript面向对象编程(二):构造函数的继承 (opens new window) (opens new window)
  • JavaScript深入之继承的多种方式和优缺点 (opens new window) (opens new window)
  • MDN - Object​.create() (opens new window) (opens new window)
编辑 (opens new window)
JavaScript原型
JavaScript事件循环

← JavaScript原型 JavaScript事件循环→

最近更新
01
theme-vdoing-blog博客静态编译问题
09-16
02
搜索引擎
07-19
03
友情链接
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2022 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式