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

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日

相关文章

  • php源码之appveyor

    PHP源码之AppVeyor攻略 AppVeyor是一种持续集成工具,可以用于构建、测试和部署PHP源码。在本攻略,我们将详细绍如何使用Appeyor构建和测试PHP源码。 步骤1:创建AppVeyor账户 在使用AppVey之前,需要创建一个Appeyor账户。可以通过以下步骤来创建AppVeyor账户: 打开AppVeyor官网,点击“Sign Up”按…

    other 2023年5月6日
    00
  • 三星note10开发者选项在哪?三星手机开发者选项启用教程

    三星Note10开发者选项在哪? 要激活三星Note10的开发者选项,请按照以下步骤逐个操作: 打开设置应用,在最底部找到“关于手机”选项。 在关于手机页面中,找到“软件信息”并点击。 在软件信息页面中,找到“构建号码”并点击七次。在第七次点击时,您将会看到一个弹出窗口告诉您已经开启了开发者选项。 回到设置页面,您现在将看到“开发者选项”在屏幕中。请点击进入…

    other 2023年6月26日
    00
  • oracle客户端管理软件安装

    Oracle客户端管理软件安装 Oracle客户端管理软件是访问Oracle数据库的必备工具。本文将介绍Oracle客户端管理软件的安装步骤。 步骤一:下载Oracle客户端管理软件 首先,需要从Oracle官网下载Oracle客户端管理软件的安装包。请注意,下载的安装包版本必须与所连接的Oracle数据库版本一致。下载完成后,可将安装包放置在本地磁盘。 步…

    其他 2023年3月28日
    00
  • mac下使用gcc

    以下是在Mac下使用gcc的完整攻略,过程中包含两个示例说明的标准Markdown格式文本: 在Mac下使用gcc的完整攻略 GCC是一种广泛使用的编译器,可以在Mac上使用。以下是在Mac下使用gcc的步骤: 确认是否已安装Xcode。Xcode是Mac上开发工具包,其中包含了GCC编译器。可以在终端中输入以下命令来检查是否已安装Xcode: bash x…

    other 2023年5月10日
    00
  • Python尾递归优化实现代码及原理详解

    Python尾递归优化实现代码及原理详解 什么是尾递归 递归是计算机编程中常用的一种算法。在递归中,函数在调用自身之前会执行一些操作。递归调用链会在一定条件下结束,如达到了某个递归深度,或者某个函数返回了终止条件。 尾递归是一种特殊的递归形式,即函数的最后一个操作是它的递归调用。在尾递归中,递归调用不会造成新的堆栈空间,它会用当前的堆栈替换掉调用它的堆栈(这…

    other 2023年6月27日
    00
  • Java中Connection timed out和Connection refused的区别讲解

    Java中Connection timed out和Connection refused的区别讲解 1. 概述 在Java中,网络编程是一种常见的操作方式。当我们使用Java程序进行网络请求时,常常会碰到Connection timed out或Connection refused的报错。这两个报错有着一些共同点,但是它们的具体含义又有所不同。在本文中,我们…

    other 2023年6月27日
    00
  • 服务器sas硬盘检测工具及各种测试方法(测通电次数)

    很抱歉,作为文本模型,我无法以标准的markdown格式回答您的问题。但是,我可以为您提供一份详细的攻略,包含服务器SAS硬盘检测工具及各种测试方法的说明。以下是完整攻略: 服务器SAS硬盘检测工具及各种测试方法 SAS硬盘检测工具介绍:SAS硬盘是一种高性能的存储设备,为了确保其正常运行,可以使用以下工具进行检测和测试: SAS硬盘管理工具:大多数服务器厂…

    other 2023年10月17日
    00
  • docker容器无法执行vim的解决方案

    当在Docker容器中使用vim时,可能会出现无法正常执行的情况。这通常是由于缺少vim依赖或Docker容器中没有vim软件包导致的。以下是解决此问题的完整攻略: 步骤1:检查vim软件包是否已安装 首先,需要检查vim软件包是否已安装。您可以使用以下命令在Docker容器中检查vim软件包是否已安装: dpkg -l vim 如果已经安装,则应该看到类似…

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