JS继承之借用构造函数继承和组合继承

yizhihongxing

JS继承之借用构造函数继承和组合继承

什么是继承?

在面向对象编程中,继承是指从一个类中派生出一个或多个新类的过程。派生类会继承父类的一些属性和方法,同时也可以有自己的一些属性和方法。

在JavaScript中,可以使用各种方式来实现继承,包括原型链继承、构造函数继承、组合继承、Class继承等。

借用构造函数继承

借用构造函数继承是指在子类构造函数中调用父类构造函数,并且使用apply或call方法将this关键字指向子类实例。这种方式可以使子类实例拥有父类构造函数中的实例变量和实例方法。

例如:

function Parent(){
    this.name = "parent";
}
Parent.prototype.sayName = function(){
    console.log(this.name);
}
function Child(){
    Parent.call(this); // 借用构造函数继承
    this.age = 18;
}
var child = new Child();
console.log(child.name); // "parent"
console.log(child.age); // 18
child.sayName(); // TypeError: child.sayName is not a function

上面的例子中,Child构造函数借用Parent构造函数,使得child实例拥有了name属性和age属性。但是child实例并没有继承Parent原型中的sayName方法。

组合继承

组合继承是指使用构造函数继承和原型链继承的组合方式来实现继承。

组合继承首先使用借用构造函数继承来继承实例属性和方法,再通过将子类原型设置为父类实例来继承原型属性和方法。

例如:

function Parent(){
    this.name = "parent";
}
Parent.prototype.sayName = function(){
    console.log(this.name);
}
function Child(){
    Parent.call(this); // 借用构造函数继承
    this.age = 18;
}
Child.prototype = new Parent(); // 原型链继承
Child.prototype.constructor = Child; // 修正constructor
var child = new Child();
console.log(child.name); // "parent"
console.log(child.age); // 18
child.sayName(); // "parent"

上面的例子中,Child构造函数借用Parent构造函数,使得child实例拥有了name属性和age属性。而将Child原型设置为Parent的实例,使得child实例还继承了Parent原型中的sayName方法。

同时,需要修正Child原型的constructor属性,指向Child构造函数本身。

示例说明

示例1

function Animal(name) {
  this.name = name;
}
Animal.prototype.eat = function() {
  console.log(this.name + " is eating.");
}

function Dog(name) {
  Animal.call(this, name); // 借用构造函数继承
}
Dog.prototype = new Animal(); // 组合继承
Dog.prototype.constructor = Dog; // 修正constructor

var dog = new Dog('Doudou');
console.log(dog.name); // Doudou
dog.eat(); // Doudou is eating.

上面的例子中,Animal构造函数有一个实例属性name和一个原型方法eat。Dog构造函数通过借用构造函数继承Animal的实例属性name,再通过组合继承继承Animal的原型方法eat。最终,dog实例既拥有了Animal的实例属性name,也拥有了Animal的原型方法eat。

示例2

function Shape(x, y) {
  this.x = x;
  this.y = y;
}
Shape.prototype.move = function(x, y) {
  this.x += x;
  this.y += y;
  console.log('Shape moved to', this.x, this.y);
}

function Circle(x, y, r) {
  Shape.call(this, x, y); // 借用构造函数继承
  this.r = r;
}
Circle.prototype = new Shape(); // 组合继承
Circle.prototype.constructor = Circle; // 修正constructor
Circle.prototype.area = function() {
  return Math.PI * this.r * this.r;
}

var circle = new Circle(0, 0, 10);
circle.move(5, 5); // Shape moved to 5 5
console.log(circle.area()); // 314.1592653589793

上面的例子中,Shape构造函数有两个实例属性x和y,以及一个原型方法move。Circle构造函数继承Shape构造函数的实例属性x和y,再通过组合继承继承Shape构造函数的原型方法move和自己的原型方法area。最终,circle实例既拥有了Shape的实例属性x和y和原型方法move,也拥有了自己的原型方法area。同时,circle可以调用move方法改变自己的位置,还可以获取自己的面积。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS继承之借用构造函数继承和组合继承 - Python技术站

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

相关文章

  • mysql数据导入导出方法总结

    以下是MySQL数据导入导出方法总结的完整攻略,过程中包含两条示例说明。 1. 数据导出 1.1 导出整个数据库 我们可以使用mysqldump命令导出整个数据库。以下是一个导出整个数据库的示例: mysqldump -u username -p database_name > backup.sql 在上述示例中,我们使用mysqldump命令导出整个…

    other 2023年5月10日
    00
  • vue实现给div绑定keyup的enter事件

    当我们在实现网页功能的时候,经常需要给页面元素绑定一些事件,以实现一些交互效果,而键盘事件是非常常见的一种事件类型。在Vue中,通过指令和事件绑定可以很方便地实现给div绑定keyup的enter事件。 具体实现步骤如下: 在Vue实例中定义一个方法,用于处理键盘事件: methods: { onEnter: function(event) { if (ev…

    other 2023年6月27日
    00
  • React路由参数传递与嵌套路由的实现详细讲解

    React 路由参数传递与嵌套路由的实现详细讲解 React 路由参数传递和嵌套路由是在构建 React 应用时非常常见的需求。本攻略将详细讲解如何实现这两个功能,并提供两个示例说明。 路由参数传递 在 React 中,我们可以使用路由参数来传递数据给组件。以下是实现路由参数传递的步骤: 安装 React 路由库:首先,确保你已经安装了 React 路由库。…

    other 2023年7月28日
    00
  • SQL Server索引结构的具体使用

    SQL Server索引结构对于数据库的性能优化非常重要,下面我将为大家详细讲解如何使用SQL Server索引结构来提高数据库的查询性能。 一、SQL Server索引结构 索引是一种数据结构,用于加速数据的检索。SQL Server有两种主要的索引类型:聚集索引和非聚集索引。聚集索引将数据行的物理顺序与逻辑顺序一致排列,而非聚集索引则使用单独的数据结构保…

    other 2023年6月27日
    00
  • mstp配置实例

    以下是关于“MSTP配置实例”的完整攻略,包含两个示例说明。 MSTP配置实例 MSTP(Multiple Spanning Tree Protocol)是一种用于在网络中防止环的协议。在本攻略中,我们将介绍如何配置MSTP以及如何在网络中使用MSTP。 1. 配置MSTP 在配置MSTP之前,我们需要确保网络中的所有设备都支持MSTP。以下是一个示例: i…

    other 2023年5月9日
    00
  • MySQL 中字符集详细介绍

    MySQL 中字符集详细介绍 MySQL 是一种流行的关系型数据库管理系统,它支持多种字符集。字符集决定了数据库中可以存储的字符的种类和编码方式。在本攻略中,我们将详细介绍 MySQL 中的字符集,并提供两个示例说明。 1. 字符集的概念 字符集是一组字符的集合,每个字符都有一个唯一的编码值。MySQL 使用字符集来存储和处理数据。常见的字符集包括 ASCI…

    other 2023年8月19日
    00
  • #2使用html+css+js制作网站教程 测试

    使用HTML+CSS+JS制作网站教程 前言 目前互联网的发展速度非常快,越来越多的人加入到了网站制作的行列中。而网站制作的基本技能包括HTML、CSS、JS等,因此我们需要一份教程来让初学者更加轻松地学习这些技术。 环境准备 在正式开始学习之前,我们需要准备一些必要的环境和工具,包括: 一台电脑 一个文本编辑器,例如VS Code、Sublime Text…

    其他 2023年3月28日
    00
  • CentOS用户账号管理详解

    CentOS用户账号管理详解 在Linux系统中,用户账号管理是非常重要的,本文将详细讲解在CentOS系统中如何管理用户账号。 添加用户账号 在CentOS系统中,添加用户账号的命令为: useradd [options] username 其中,[options]为可选参数,username为新建用户的名称。常用的选项有: -c :添加用户的备注信息。 …

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