JavaScript常见继承模式实例小结

下面是JavaScript常见继承模式实例小结的完整攻略。

常见继承模式实例小结

在JavaScript中实现继承有多种方法,下面将会介绍常见的几种方法,并通过示例说明。

1. 原型链继承

原型链继承是JavaScript中最常见的继承模式,它的实现方法如下:

function Animal (name) {
  this.name = name
}

Animal.prototype.sayName = function () {
  console.log(this.name)
}

function Dog (name) {
  this.type = 'dog'
}

Dog.prototype = new Animal()

var dog1 = new Dog('小黄')
dog1.sayName() // 小黄

上述代码中创建了一个Animal构造函数,并在Animal的原型中添加了sayName方法。接着创建了一个Dog构造函数,并将Dog的原型指向了Animal的实例。这样,Dog的实例就能够继承Animal的属性和方法。

2. 借用构造函数继承

借用构造函数继承也是一种常见的继承模式,它的实现方法如下:

function Animal (name) {
  this.name = name
}

Animal.prototype.sayName = function () {
  console.log(this.name)
}

function Dog (name) {
  Animal.call(this, name)
  this.type = 'dog'
}

var dog1 = new Dog('小黄')
dog1.sayName() // TypeError: dog1.sayName is not a function

上述代码中创建了一个Animal构造函数,并在Animal的原型中添加了sayName方法。接着创建了一个Dog构造函数,在Dog构造函数中通过call方法将this指向Animal,并且将name作为参数传入。这样,Dog的实例就能够继承Animal的属性,但无法继承Animal的方法。

3. 组合继承

组合继承是上述两种继承模式的结合体,它的实现方法如下:

function Animal (name) {
  this.name = name
}

Animal.prototype.sayName = function () {
  console.log(this.name)
}

function Dog (name) {
  Animal.call(this, name)
  this.type = 'dog'
}

Dog.prototype = new Animal()
Dog.prototype.constructor = Dog

var dog1 = new Dog('小黄')
dog1.sayName() // 小黄

上述代码中创建了一个Animal构造函数,并在Animal的原型中添加了sayName方法。接着创建了一个Dog构造函数,在Dog构造函数中通过call方法将this指向Animal,并且将name作为参数传入。然后将Dog的原型指向Animal的实例,并将Dog的原型的constructor属性指向Dog。这样,Dog的实例既能够继承Animal的属性,也能继承Animal的方法。

4. 原型式继承

原型式继承是通过一个对象创建另一个对象,它的实现方法如下:

var animal = {
  name: '动物',
  sayName: function () {
    console.log(this.name)
  }
}

var dog1 = Object.create(animal)
dog1.type = 'dog'

dog1.sayName() // 动物

上述代码中创建了一个animal对象,并在animal对象中添加了name属性和sayName方法。接着通过Object.create方法,将dog1对象的原型指向animal对象,然后在dog1对象中添加了type属性。这样,dog1对象就能够继承animal对象的属性和方法。

5. 寄生式继承

寄生式继承是在原型式继承的基础上添加一些新的属性或方法,它的实现方法如下:

var animal = {
  name: '动物',
  sayName: function () {
    console.log(this.name)
  }
}

function createDog (name) {
  var dog = Object.create(animal)
  dog.type = 'dog'
  dog.sayType = function () {
    console.log(this.type)
  }
  return dog
}

var dog1 = createDog('小黄')
dog1.sayName() // 动物
dog1.sayType() // dog

上述代码中创建了一个animal对象,并在animal对象中添加了name属性和sayName方法。接着创建了一个createDog函数,在createDog函数中通过Object.create方法将dog对象的原型指向animal对象,并在dog对象中添加了type属性和sayType方法。最后返回dog对象,这样,dog对象就能够继承animal对象的属性和方法,并添加新的属性和方法。

6. 寄生组合式继承

寄生组合式继承是在组合继承的基础上,使用Object.create方法来使Animal的实例作为Dog的原型,避免了组合继承中创建两次Animal实例的问题。它的实现方法如下:

function Animal (name) {
  this.name = name
}

Animal.prototype.sayName = function () {
  console.log(this.name)
}

function Dog (name) {
  Animal.call(this, name)
  this.type = 'dog'
}

Dog.prototype = Object.create(Animal.prototype)
Dog.prototype.constructor = Dog

var dog1 = new Dog('小黄')
dog1.sayName() // 小黄

上述代码中创建了一个Animal构造函数,并在Animal的原型中添加了sayName方法。接着创建了一个Dog构造函数,在Dog构造函数中通过call方法将this指向Animal,并且将name作为参数传入。然后将Dog的原型指向Animal的原型通过Object.create方法,避免了组合继承中创建两次Animal实例的问题,最后将Dog的原型的constructor属性指向Dog。这样,Dog的实例既能够继承Animal的属性,也能继承Animal的方法。

这就是JavaScript常见继承模式实例的小结。它们各有优缺点,针对不同的场景,选择不同的继承模式能够更好的解决问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript常见继承模式实例小结 - Python技术站

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

相关文章

  • Go语言接口的嵌套的具体使用

    Go语言接口的嵌套的具体使用攻略 在Go语言中,接口的嵌套是一种强大的特性,它允许我们将多个接口组合成一个新的接口。这种组合可以帮助我们更好地组织和复用代码。下面是关于Go语言接口嵌套的详细攻略。 1. 接口嵌套的基本概念 接口嵌套是指在一个接口中嵌入另一个接口。被嵌套的接口称为内嵌接口,嵌套接口可以继承内嵌接口的所有方法。通过接口嵌套,我们可以将多个接口的…

    other 2023年7月27日
    00
  • SVG 入门——理解viewport,viewbox,preserveAspectRatio

    SVG 入门——理解viewport,viewbox,preserveAspectRatio 什么是SVG? SVG(Scalable Vector Graphics:可缩放矢量图形)是一种用于描述二维矢量图形的XML标准,它可以在任何分辨率下被高保真地显示,也可以被无限放大而不失真,因此非常适合用于图标、图像和动画等场景。 SVG 的基本概念 当我们开始使…

    其他 2023年3月28日
    00
  • 实例讲解Android应用中自定义组合控件的方法

    实例讲解Android应用中自定义组合控件的方法 在Android应用开发中,自定义组合控件可以让我们更加方便地复用UI控件,提高开发效率和可维护性。下面我们将详细讲解如何实现Android应用中的自定义组合控件。 步骤 1. 新建一个自定义控件类 我们可以继承任意一个Android原生控件类,并在其基础上自定义。下面以继承LinearLayout为例,我们…

    other 2023年6月26日
    00
  • CSS的一些编程规范总结

    CSS的一些编程规范总结 在编写CSS代码时,遵循一些规范可以提高代码的可读性和可维护性。以下是一些常见的CSS编程规范的总结。 1. 选择器命名规范 选择器命名应该具有描述性,清晰明了,以便于他人理解和维护代码。以下是一些选择器命名的最佳实践: 使用有意义的名称:选择器名称应该能够准确地描述所选择的元素。避免使用无意义的名称或缩写。 使用小写字母和短横线:…

    other 2023年9月6日
    00
  • vivo X Flip开发者选项在哪 vivo X Flip进入开发者模式教程

    下面是关于“vivo X Flip开发者选项在哪 vivo X Flip进入开发者模式教程”的详细攻略: 1. 如何打开vivo X Flip的开发者选项 要启用vivo X Flip的开发者选项,您需要按照以下步骤操作: 在vivo X Flip设备上进入“设置”应用。 滚动到底部,点击“关于手机”或“系统版本”,这将显示您的设备的基本信息。 在基本信息页…

    other 2023年6月26日
    00
  • latex怎么自适应表格宽度

    在LaTeX中,可以使用tabularx宏包来实现自适应表格宽度。以下是使用tabularx宏包的详细说明: 基本用法 要使用tabularx宏包,需要在导言区中添加以下代码: latex \usepackage{tabularx} 然后,可以使用tabularx环境来创建自适应表格。以下是一个基本的示例: latex \begin{tabularx}{\t…

    other 2023年5月7日
    00
  • 简述JAVA中堆内存与栈内存的区别

    简述JAVA中堆内存与栈内存的区别 在Java中,堆内存(Heap Memory)和栈内存(Stack Memory)是两种不同的内存区域,用于存储程序运行时的数据。它们在分配方式、生命周期和存储内容等方面有着明显的区别。 堆内存(Heap Memory) 堆内存是用于存储对象实例的内存区域。它的分配方式是动态的,即在程序运行时根据需要进行分配和释放。堆内存…

    other 2023年8月2日
    00
  • Linux系统中如何实现远程控制

    在Linux系统中,我们可以使用远程控制工具来实现远程控制。下面将详细讲解两种实现远程控制的方法,包括SSH和VNC。 1. SSH远程控制 1.1 什么是SSH SSH是一种广泛用于远程登录和传输数据的加密协议。它可以通过互联网或本地网络连接到远程计算机,使用户可以通过命令行界面(CLI)进行操作。 1.2 基本用法 使用SSH需要在本地计算机上安装SSH…

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