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日

相关文章

  • VScode中配置使用fortran的方法

    下面是详细讲解VScode中配置使用Fortran的方法: 前置条件 在开始配置使用Fortran之前,需要确保以下条件已满足: 已安装Visual Studio Code 已安装Fortran编译器(如GNU Fortran) 步骤一:安装使用Fortran的扩展 在Visual Studio Code中,可以通过安装扩展来支持使用Fortran,具体步骤…

    other 2023年6月26日
    00
  • mac安装java配置

    Mac安装Java配置 Java是一种跨平台的编程语言,拥有广泛的应用。如果你想要在Mac电脑上运行Java程序,你需要先安装Java运行环境,并进行相关的配置。本文将会介绍Mac系统上Java的安装、配置、验证等详细步骤。 步骤1:下载Java运行环境 访问Oracle公司的官方网站下载Java运行环境,选择与你电脑系统版本相对应的版本,如macOS 11…

    其他 2023年3月28日
    00
  • python 面向对象三大特征详解

    当我们学习 Python 面向对象编程时,需要掌握三大特征,即封装、继承和多态。接下来,我将详细讲解这三个特征及其使用方法。 封装 封装是一种将数据和方法打包在一起的方法,可以确保对象在被外部访问时保持一致性。在 Python 中,我们可以使用 class 关键字来定义一个类,并使用属性和方法来封装数据。以下是一个简单的示例: class Dog: def …

    other 2023年6月27日
    00
  • Sublime Text3添加到右键快捷菜单教程(亲测可用)

    当你经常使用Sublime Text 3作为你的主编辑器时,你可以将它添加到右键菜单,这样就非常方便了,省去了打开软件的麻烦。下面是添加Sublime Text 3到右键菜单的完整攻略。 步骤1:编辑注册表 在Windows 10中添加右键菜单需要编辑Windows注册表,先按下“Win + R”组合键打开运行窗口,在运行窗口中输入regedit,打开注册表…

    other 2023年6月27日
    00
  • 手机驱动

    手机驱动攻略 什么是手机驱动? 手机驱动是一种软件,它允许操作系统与手机硬件之间进行通信和交互。手机驱动通常由手机制造商提供,用于确保操作系统能够正确地识别和使用手机的各种功能和硬件组件。 手机驱动的安装步骤 以下是安装手机驱动的一般步骤: 确定手机型号:在安装手机驱动之前,您需要确定您的手机型号和制造商。这通常可以在手机的设置菜单中找到,或者您可以查看手机…

    other 2023年8月4日
    00
  • 详解React 在服务端渲染的实现

    下面是详解React在服务端渲染的实现的完整攻略。 什么是服务端渲染? 服务端渲染是指在服务端生成HTML页面,然后将该页面发送到客户端进行显示。相对于客户端渲染,服务端渲染的主要优势在于能够提高首屏渲染速度、SEO友好以及更好地支持一些不支持JavaScript的老旧浏览器。 React服务端渲染实现的方式 React有两种方式支持服务端渲染,分别是: R…

    other 2023年6月27日
    00
  • 关于java:在securerandom类中使用“sha1prng”

    Java中的SecureRandom类是用于生成随机数的类,可以用于密码学、安全哈希等领域。在SecureRandom类中,可以使用“SHA1PRNG”算法来生成随机数。本文将详细讲解在SecureRandom中使用“SHA1PRNG”的攻略,包括使用方法和示例说明。 SecureRandom类中使用“SHA1PRNG” SecureRandom类中使用“S…

    other 2023年5月7日
    00
  • python删除文件夹中具有相同后缀类型文件的实战演练

    Python删除文件夹中具有相同后缀类型文件的实战演练攻略 在Python中,你可以使用os模块和glob模块来删除文件夹中具有相同后缀类型的文件。下面是一个详细的攻略,包含两个示例说明。 步骤1:导入必要的模块 首先,你需要导入os模块和glob模块。os模块提供了与操作系统交互的功能,而glob模块用于匹配文件路径名。 import os import …

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