JS高级ES6的6种继承方式

下面是JS高级ES6的6种继承方式的详细攻略。

1. 经典继承(原型链继承)

原理:

子类的原型为父类的一个实例,通过设置子类的原型链,使子类可以访问父类的属性和方法,也就实现了继承。

示例:

// 父类
function Animal(name) {
  this.name = name;
  this.sayName = function() {
    console.log(this.name);
  }
}

// 子类
function Dog(name) {
  this.bark = function() {
    console.log('Woof!');
  }
  Animal.call(this, name);
}

Dog.prototype = new Animal();

// 实例化子类
const puppy = new Dog('Puppy');

puppy.sayName(); // 输出:Puppy
puppy.bark(); // 输出:Woof!

2. 构造函数继承

原理:

通过在子类构造函数中调用父类构造函数,以达到继承父类属性和方法的目的。

示例:

// 父类
function Animal(name) {
  this.name = name;
  this.sayName = function() {
    console.log(this.name);
  }
}

// 子类
function Dog(name) {
  Animal.call(this, name);
  this.bark = function() {
    console.log('Woof!');
  }
}

// 实例化子类
const puppy = new Dog('Puppy');

puppy.sayName(); // 输出:Puppy
puppy.bark(); // 输出:Woof!

3. 组合继承(原型链继承和构造函数继承结合)

原理:

先使用原型链继承父类的属性和方法,再通过构造函数继承父类的属性和方法,从而既继承了父类的属性和方法,又避免了子类实例修改父类属性或方法造成的影响。

示例:

// 父类
function Animal(name) {
  this.name = name;
  this.sayName = function() {
    console.log(this.name);
  }
}

// 子类
function Dog(name) {
  Animal.call(this, name);
  this.bark = function() {
    console.log('Woof!');
  }
}

Dog.prototype = new Animal();

// 实例化子类
const puppy = new Dog('Puppy');

puppy.sayName(); // 输出:Puppy
puppy.bark(); // 输出:Woof!

4. 原型式继承

原理:

以一个对象为原型创建一个子对象,通过使用Object.create实现原型式继承。

示例:

// 父对象
const Animal = {
  name: '',
  sayName() {
    console.log(this.name);
  }
}

// 子对象
const Dog = Object.create(Animal);
Dog.bark = function() {
  console.log('Woof!');
}

// 实例化子对象
const puppy = Object.create(Dog);
puppy.name = 'Puppy';

puppy.sayName(); // 输出:Puppy
puppy.bark(); // 输出:Woof!

5. 寄生式继承

原理:

与原型式继承类似,不同在于寄生式继承在创建的新对象上增加新的方法,而不是在原型上增加。

示例:

// 父对象
const Animal = {
  name: '',
  sayName() {
    console.log(this.name);
  }
}

// 子对象
function Dog(name) {
  const dog = Object.create(Animal);
  dog.bark = function() {
    console.log('Woof!');
  }
  dog.name = name;
  return dog;
}

// 实例化子对象
const puppy = Dog('Puppy');

puppy.sayName(); // 输出:Puppy
puppy.bark(); // 输出:Woof!

6. 寄生组合式继承(ES6改进版组合继承)

原理:

以函数封装组合继承,通过ES6中的class和extends语法糖实现,从而避免了构造函数多次调用父类的问题。

示例:

// 父类
class Animal {
  constructor(name) {
    this.name = name;
  }

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

// 子类
class Dog extends Animal {
  constructor(name) {
    super(name);
  }

  bark() {
    console.log('Woof!');
  }
}

// 实例化子类
const puppy = new Dog('Puppy');

puppy.sayName(); // 输出:Puppy
puppy.bark(); // 输出:Woof!

以上就是JS高级ES6的6种继承方式的完整攻略,希望能够对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS高级ES6的6种继承方式 - Python技术站

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

相关文章

  • MySQL大表中重复字段的高效率查询方法

    针对MySQL大表中重复字段的高效率查询,常见的解决方法包括使用索引或者分库分表等方式,下面我将详细讲解这方面的攻略。 索引优化 使用索引是提高MySQL查询效率的常用方法,对于大表中的重复字段尤其有效。在使用索引时,我们需要注意如下几点: 对于经常查询的字段,建议使用单独的索引,避免创建复合索引。 对于varchar类型的字段,建议指定长度。例如,如果某字…

    other 2023年6月25日
    00
  • Android 自定义星评空间示例代码

    Android 自定义星评空间示例代码攻略 本文将详细讲解自定义星评空间示例代码的实现过程。星评空间可以用于用户评分等场景,采用自定义控件实现,较为灵活。具体步骤如下: 1.设计界面和布局 首先,需要在Android Studio中新建一个布局文件,设计星级评分控件的UI界面。依据需求,可以添加TextView、ImageView等视图。其中,TextVie…

    other 2023年6月25日
    00
  • springboot整合H2内存数据库实现单元测试与数据库无关性

    Spring Boot整合H2内存数据库实现单元测试与数据库无关性 H2是一个内存数据库,它可以与Spring Boot一起使用,以实现单元测试时与实际数据库无关的特性。以下是实现这一目标的完整攻略: 添加H2依赖:在pom.xml文件中添加H2依赖项。 <dependency> <groupId>com.h2database<…

    other 2023年10月17日
    00
  • JavaScript 中的 this 绑定规则详解

    当我们在Javascript中使用this关键字时,实际上是在引用一个对象,这个对象是当前函数所属的上下文。但是this的值可能会发生变化,取决于函数的执行环境。本文将详细介绍this绑定规则。 全局上下文 在全局上下文中,this指向全局对象,即window对象(在浏览器中)。 console.log(this); // Window对象 函数上下文 在函…

    other 2023年6月27日
    00
  • iOS10 Beta8怎么样?苹果iOS10开发者预览版Beta8上手评测

    iOS10 Beta8怎么样? 介绍 iOS10是苹果公司最新的操作系统。作为一款备受期待的操作系统,它拥有许多新功能和性能提升。iOS10已经发布了多个Beta版本,其中Beta8是最新的开发者预览版。在本文中,我们将探讨iOS10 Beta8的新功能以及用户体验。 新特性 更好的消息体验:iOS10之前,消息应用只能接收和发送文本信息。现在,苹果将这一体…

    other 2023年6月26日
    00
  • hyperbase常用sql

    Hyperbase常用SQL攻略 Hyperbase是一个基于云的数据库服务,提供了一系列的SQL操作,可以方便地对数据进行增删改查等操作。本文将详细讲解Hyperbase常用SQL的攻略,包括两个示例说明。 1. 连接Hyperbase 在使用Hyperbase之前,需要连接Hyperbase。可以使用以下命令连接Hyperbase: mysql -h &…

    other 2023年5月7日
    00
  • Android5.1系统通过包名给应用开放系统权限的方法

    Android 5.1系统通过包名给应用开放系统权限的方法攻略 在Android 5.1系统中,可以通过以下步骤给应用开放系统权限: 确定应用的包名:首先,需要确定要给应用开放权限的包名。包名是应用在Android系统中的唯一标识符,可以在应用的清单文件(AndroidManifest.xml)中找到。 编辑系统权限配置文件:接下来,需要编辑系统权限配置文件…

    other 2023年9月7日
    00
  • Mybatis中ResultMap解决属性名和数据库字段名不一致问题

    Mybatis中的ResultMap是用于解决属性名和数据库字段名不一致问题的重要工具。它允许我们自定义Java对象属性和数据库表字段之间的映射关系,并通过这种方式来解决名称不匹配的问题。下面是在Mybatis中使用ResultMap的步骤和示例。 第一步:定义ResultMap要定义一个ResultMap,可以在mapper.xml文件中使用<res…

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