js的三种继承方式详解

下面我将详细讲解 JavaScript 的三种继承方式。

1. 原型继承

原型继承是 JavaScript 中最基本的继承方式,它实现的原理是通过使用 prototype 属性。在原型继承中,子类的原型对象指向父类的实例对象,从而实现继承。

以下是一个实现原型继承的示例代码:

function Person(name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype.sayHello = function() {
    console.log("Hello, my name is " + this.name + ", I'm " + this.age + " years old.");
}

function Student(name, age, grade) {
    this.grade = grade;
    Person.call(this, name, age);
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

let stu = new Student("Tom", 20, 3);
stu.sayHello(); // Hello, my name is Tom, I'm 20 years old.
console.log(stu instanceof Student); // true
console.log(stu instanceof Person); // true

在上面的代码中,我们定义了一个 Person 构造函数,它拥有一个 sayHello 方法。然后我们定义了一个 Student 构造函数,我们通过 Object.create 方法使 Student 的原型对象指向 Person 的原型对象,实现继承,然后重置其 constructor 属性为 StudentObject.create 会将 constructor 属性重置为 Person)。最后我们创建一个 Student 实例,并且可以使用继承自 PersonsayHello 方法。

2. 构造函数继承

构造函数继承主要是通过在子类中调用父类构造函数实现的。在构造函数继承中,子类实例会继承父类的属性和方法。但是,这种继承方式无法继承父类原型上的属性和方法。

以下是一个实现构造函数继承的示例代码:

function Person(name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype.sayHello = function() {
    console.log("Hello, my name is " + this.name + ", I'm " + this.age + " years old.");
}

function Student(name, age, grade) {
    Person.call(this, name, age);
    this.grade = grade;
}

let stu = new Student("Tom", 20, 3);
stu.sayHello(); // TypeError: stu.sayHello is not a function
console.log(stu instanceof Student); // true
console.log(stu instanceof Person); // false

在上面的代码中,我们定义了一个 Person 构造函数,然后我们定义了一个 Student 构造函数,通过在 Student 中调用 Person 的构造函数实现属性和方法的继承。我们可以创建一个 Student 实例,并且可以使用从 Person 中继承的属性,但无法访问它的 prototype,因为 prototype 对象上的属性和方法不会继承到子类上。

3. 组合继承

组合继承是上述两种继承方式的结合体,它继承了构造函数继承和原型继承的优点。在组合继承中,通过在子类中调用父类构造函数实现属性的继承,然后将子类的原型对象指向父类的原型对象,实现方法的继承。

以下是一个实现组合继承的示例代码:

function Person(name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype.sayHello = function() {
    console.log("Hello, my name is " + this.name + ", I'm " + this.age + " years old.");
}

function Student(name, age, grade) {
    Person.call(this, name, age);
    this.grade = grade;
}
Student.prototype = new Person();
Student.prototype.constructor = Student;

let stu = new Student("Tom", 20, 3);
stu.sayHello(); // Hello, my name is Tom, I'm 20 years old.
console.log(stu instanceof Student); // true
console.log(stu instanceof Person); // true

在上面的代码中,我们定义了一个 Person 构造函数,它拥有一个 sayHello 方法。然后我们定义了一个 Student 构造函数,并在其中调用了 Person 的构造函数,实现属性的继承。最后我们通过将 Student 的原型对象指向一个新的 Person 的实例对象,实现从 Person 中继承方法。我们可以创建一个 Student 实例,并且可以使用从 Person 中继承的属性和方法。

以上就是 JavaScript 中的三种继承方式,不同的继承方式可以根据实际情况选择使用,从而更好地解决问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js的三种继承方式详解 - Python技术站

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

相关文章

  • rqalpha环境搭建(windows版)

    RQAlpha环境搭建(Windows版) RQAlpha是一款Python下基于Python3的开源量化交易研究框架。相较于其他的Python量化框架,RQAlpha具有开源、便捷、高效和易用等优点。在Windows系统下,RQAlpha的环境搭建需要涉及到Python环境配置、RQAlpha安装以及TA-Lib安装等步骤。下文将逐一介绍Windows系统…

    其他 2023年3月28日
    00
  • Qt中控件的函数使用教程分享

    Qt中控件的函数使用教程分享 本文主要介绍在Qt中常用控件的使用方法及相关函数,希望能够对初学者有所帮助。 QLabel控件 QLabel控件用于显示文本或图像,其常用函数及用法如下: 1. setText(const QString& text) 设置标签显示的文本内容,例如: QLabel* label = new QLabel(this); l…

    other 2023年6月26日
    00
  • androidwi-fidisplay(miracast)介绍

    Android Wi-Fi Display(Miracast)介绍 Android Wi-Fi Display,也称为Miracast,是一种通过Wi-Fi Direct技术无线传输视频和音频的标准。它允许您将Android设备的屏幕投射到同样支持Miracast的接收器上,例如电视或显示器。在这篇文章中,我们将介绍Miracast的工作原理,以及如何使用它…

    其他 2023年3月28日
    00
  • 迅雷8g离线内存空间免费领 迅雷领取8g空间方法图文介绍

    迅雷8g离线内存空间免费领攻略 迅雷是一款常用的下载工具,它提供了离线内存空间,可以让用户在离线状态下继续下载任务。本攻略将详细介绍如何免费领取迅雷8g离线内存空间,并提供两个示例说明。 步骤一:登录迅雷账号 首先,确保你已经拥有一个迅雷账号。如果没有,请前往迅雷官网注册一个账号。 步骤二:打开迅雷软件 在电脑上打开迅雷软件,并使用你的账号登录。 步骤三:进…

    other 2023年7月31日
    00
  • C语言数据结构中堆排序的分析总结

    C语言数据结构中堆排序的分析总结 堆排序的基本思路 堆排序(Heap Sort)是利用堆这种数据结构而设计的一种排序算法,堆排序是选择排序的一种。堆排序分为两种方法,分别是大根堆排序和小根堆排序。下面以大根堆排序为例讲解堆排序的基本思路。 将初始待排序关键字序列(R1,R2….Rn)构建成大根堆,此堆为初始的无序区。 将堆顶元素R[1]与最后一个元素R[…

    other 2023年6月27日
    00
  • android 中 SQLiteOpenHelper的封装使用详解

    下面我将为你详细讲解如何在 Android 中封装使用 SQLiteOpenHelper。 概述 SQLiteOpenHelper 是 Android 提供的一个 SQLite 数据库帮助类,它可以帮助我们创建数据库,并提供了升级、降级、数据迁移等功能。但是,SQLiteOpenHelper 并没有提供特别友好的 API,因此我们需要对其进行进一步的封装以提…

    other 2023年6月25日
    00
  • 使用华为云鲲鹏弹性云服务器部署Discuz的详细过程

    使用华为云鲲鹏弹性云服务器部署Discuz的过程可以分为以下几步: 创建鲲鹏弹性云服务器 配置服务器环境 安装与配置MySQL 下载与配置Discuz 安装与配置nginx 配置防火墙 下面详细介绍每一步的具体操作过程: 创建鲲鹏弹性云服务器 在华为云上创建鲲鹏弹性云服务器的过程可以参考官方文档:https://support.huaweicloud.com…

    other 2023年6月26日
    00
  • flexslider

    Flexslider完整攻略 Flexslider是一个流行的响应式幻灯片插件,它可以轻松地在网站上创建漂亮的幻灯片。以下是使用Flexslider的完攻略。 安装Flexslider 要使用Flexslider,您需要先将其下载到您的项目中。您可以从Flexslider的官方网站下载新版本的Flexslider。 下载完成后,将Flexslider的CSS…

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