JavaScript 继承详解(五)

JavaScript 继承是面向对象编程中常见的概念,本篇文章主要介绍了以下五种继承方式:原型继承、借用构造函数继承、组合继承、寄生组合式继承、class继承。

原型继承

原型继承是指通过 prototype 对象的原型链进行继承。子类的 prototype 原型链指向了父类的实例,从而实现继承。示例如下:

function Parent() {
  this.name = 'parent'
}

Parent.prototype.say = function() {
  console.log('hello')
}

function Child() {}

Child.prototype = new Parent()
Child.prototype.constructor = Child

let child = new Child()
console.log(child.name) // parent
child.say() // hello

借用构造函数继承

借用构造函数继承指通过 callapply 方法来调用父类构造函数,从而继承父类属性。示例如下:

function Parent() {
  this.name = 'parent'
  this.play = [1, 2, 3]
}

function Child() {
  Parent.call(this)
}

let child1 = new Child()
let child2 = new Child()
child1.play.push(4)
console.log(child1.play) // [1, 2, 3, 4]
console.log(child2.play) // [1, 2, 3]

组合继承

组合继承是综合原型继承和借用构造函数继承的方式。它先通过 callapply 方法继承父类属性,再通过将父类实例作为子类原型的方式来继承方法。示例如下:

function Parent(name) {
  this.name = name
  this.play = [1, 2, 3]
}

Parent.prototype.sayName = function() {
  console.log(this.name)
}

function Child(name, age) {
  Parent.call(this, name)
  this.age = age
}

Child.prototype = new Parent()
Child.prototype.constructor = Child

let child1 = new Child('kevin', '18')
let child2 = new Child('daisy', '20')

child1.play.push(4)
console.log(child1.play) // [1, 2, 3, 4]
console.log(child2.play) // [1, 2, 3]

child1.sayName() // kevin
child2.sayName() // daisy

寄生组合式继承

寄生组合式继承是组合继承的优化,它通过 Object.create 方法来优化了原型继承的方式,从而减少了调用父类构造函数的次数。示例如下:

function Parent(name) {
  this.name = name
  this.play = [1, 2, 3]
}

Parent.prototype.sayName = function() {
  console.log(this.name)
}

function Child(name, age) {
  Parent.call(this, name)
  this.age = age
}

Child.prototype = Object.create(Parent.prototype)
Child.prototype.constructor = Child

let child1 = new Child('kevin', '18')
let child2 = new Child('daisy', '20')

child1.play.push(4)
console.log(child1.play) // [1, 2, 3, 4]
console.log(child2.play) // [1, 2, 3]

child1.sayName() // kevin
child2.sayName() // daisy

class继承

class继承是ES6中新增的继承方法,通过 classextends 定义父子类, super 关键字来代替 call 方法实现父类属性的继承。示例如下:

class Parent {
  constructor(name) {
    this.name = name
    this.play = [1, 2, 3]
  }

  sayName() {
    console.log(this.name)
  }
}

class Child extends Parent {
  constructor(name, age) {
    super(name)
    this.age = age
  }
}

let child1 = new Child('kevin', '18')
let child2 = new Child('daisy', '20')

child1.play.push(4)
console.log(child1.play) // [1, 2, 3, 4]
console.log(child2.play) // [1, 2, 3]

child1.sayName() // kevin
child2.sayName() // daisy

以上就是关于JavaScript 继承的五种方式的详细介绍,在实际应用中可以根据具体情况选择不同的继承方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript 继承详解(五) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 魔兽世界wlk怀旧服敏锐贼堆什么属性 敏锐贼属性优先级选择攻略

    魔兽世界wlk怀旧服敏锐贼堆什么属性 简介 敏锐贼(通常指刺杀贼)在WotLK版本中以其高伤害和高爆发力而为人熟知,但是对于玩家来说,在敏锐贼在分配属性时,往往会有些困惑。本攻略将为敏锐贼的属性分配提供一些指导。 敏锐贼属性优先级选择攻略 1. 确定攻击速度 在了解敏锐贼的属性之前,我们需要首先确定相应的攻击速度。敏锐贼需要以突袭和毒药等使用技能为主的方式发…

    other 2023年6月27日
    00
  • 一步一步跟我学易语言之变量的有效范围

    一步一步跟我学易语言之变量的有效范围 在易语言中,变量的有效范围指的是变量在程序中可以被访问和使用的范围。了解变量的有效范围对于编写易语言程序非常重要。下面是一份详细的攻略,将帮助你理解易语言中变量的有效范围。 1. 全局变量 全局变量是在程序的任何地方都可以访问和使用的变量。在易语言中,你可以在程序的任何位置声明全局变量。全局变量的有效范围从声明的位置开始…

    other 2023年7月29日
    00
  • 苹果发布watchOS 6.2.8首个开发人员测试版(附更新内容及升级方法)

    苹果发布watchOS 6.2.8首个开发人员测试版 苹果公司于2020年7月10日发布了watchOS 6.2.8首个开发人员测试版,这是一次更新迭代升级,本文介绍该更新内容和升级方法。 更新内容 watchOS 6.2.8主要更新内容如下:- 进一步优化了系统性能和稳定性;- 修复了已知的问题。 升级步骤 以下是watchOS 6.2.8升级步骤: 确保…

    other 2023年6月26日
    00
  • mac平台下部署ue4工程到ios设备的流程

    以下是在Mac平台下部署UE4工程到iOS设备的完整攻略,包含两个示例说明: 步骤1:安装必要的软件 在Mac平台上部署UE4工程到iOS设备之前,需要安装以下软件: Xcode:用于编译iOS应用程序。 Unreal Engine 4:用于创建和编辑UE4工程。 iOS设备驱动程序:用于将iOS设备连接到Mac电脑。 步骤2:设置UE4工程 在UE4中设置…

    other 2023年5月9日
    00
  • 一文带你了解Spring的Bean初始化过程和生命周期

    下面是一篇关于Spring的Bean初始化过程和生命周期的完整攻略。 Spring的Bean初始化过程和生命周期 1. 什么是Bean初始化过程 在Spring框架中,Bean的初始化过程指的是Spring从IoC容器中读取Bean的配置信息,然后创建Bean对象,为Bean对象注入属性以及其他依赖关系,并为Bean对象执行初始化方法的过程。 在整个过程中,…

    other 2023年6月20日
    00
  • powerbi度量值分组统计

    Power BI度量值分组统计 概述 在使用Power BI处理数据时,度量值的分组统计是必不可少的操作之一。本文将介绍如何通过Power BI对度量值进行分组统计,使得数据更加直观、易于分析和理解。 步骤 步骤一:建立数据模型 在Power BI中导入数据源,并创建数据模型。假设我们要对销售额进行分组统计,数据源包含了以下几个字段:销售日期、销售额、商品名…

    其他 2023年3月28日
    00
  • 关于UDP服务器客户端编程流程介绍

    关于UDP服务器客户端编程流程介绍 1. UDP服务器编程流程 步骤1:创建UDP socket 在使用UDP进行通信前,需要选定一个端口号并创建一个UDP socket。可以使用以下代码创建一个UDP socket: import socket # 创建一个UDP socket server_socket = socket.socket(socket.AF…

    other 2023年6月27日
    00
  • Mysql修改字段名和修改字段类型的实例代码

    下面是基于Markdown格式的攻略: Mysql修改字段名和修改字段类型的实例代码 修改字段名 当需要修改表的某个字段的名称时,可以使用ALTER TABLE命令,具体实例代码如下: 假设有一个名为users的表,里面有字段name,需要将它的名称修改为username,可以执行以下的SQL语句: ALTER TABLE users CHANGE COLU…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部