JavaScript继承模式粗探

yizhihongxing

JavaScript继承模式粗探

在 JavaScript 中实现继承的方式有很多,本文将介绍五种不同的继承模式,并通过示例代码进行说明和比较。

1. 原型链继承

原型链继承是最常见的一种继承方式,其基本思想是通过将子类的原型设为父类的实例实现继承。

function Parent() {
  this.name = 'parent';
  this.say = function() {
    console.log('Hello, I am ' + this.name);
  }
}

Parent.prototype.show = function() {
  console.log('show in parent');
}

function Child() {}

Child.prototype = new Parent(); // 子类的原型设为父类的实例

const child = new Child();
console.log(child.name); // parent
console.log(child.show()); // "show in parent"
console.log(child.say()); // "Hello, I am parent"

但是原型链继承有一个致命的缺陷,即父类的引用属性会被所有子类实例共享,容易导致修改一个子类实例的引用属性时,其他实例的引用属性也会跟着改变。

2. 借用构造函数继承

借用构造函数继承是通过调用父类的构造函数来实现继承。

function Parent(name) {
  this.name = name;
  this.say = function() {
    console.log('Hello, I am ' + this.name);
  }
}

function Child(name) {
  Parent.call(this, name); // 在子类构造函数中调用父类构造函数
}

const child1 = new Child('child1');
const child2 = new Child('child2');
console.log(child1.say()); // "Hello, I am child1"
console.log(child2.say()); // "Hello, I am child2"

但是借用构造函数继承的缺点是无法继承父类原型上的方法和属性。

3. 组合继承

组合继承是将原型链继承和借用构造函数继承结合起来,既能继承父类构造函数中的属性,又能继承父类原型上的方法。

function Parent(name) {
  this.name = name;
  this.say = function() {
    console.log('Hello, I am ' + this.name);
  }
}

Parent.prototype.show = function() {
  console.log('show in parent');
}

function Child(name) {
  Parent.call(this, name);
}

Child.prototype = new Parent(); // 将子类的原型设为父类的实例
Child.prototype.constructor = Child; // 修正constructor

const child = new Child('child');
console.log(child.name); // child
console.log(child.show()); // "show in parent"
console.log(child.say()); // "Hello, I am child"

可以看到,组合继承综合了原型链继承和借用构造函数继承的优点,但是存在一个缺点就是在使用子类生成对象时,调用了两次父类构造函数,第一次是在将子类原型指向父类实例时,第二次是在子类构造函数中。

4. 原型式继承

原型式继承是基于某个对象创建一个副本作为新对象的原型,然后扩展新对象,从而实现继承。

const parent = {
  name: 'parent',
  say: function() {
    console.log('Hello, I am ' + this.name);
  }
}

const child = Object.create(parent); // 基于parent创建child的原型
child.name = 'child';

console.log(child.say()); // "Hello, I am child"

但是原型式继承也存在跟原型链继承相同的问题,即引用类型的属性会被所有实例共享。

5. 寄生式继承

寄生式继承是在原型式继承的基础上,将扩展对象的过程封装在函数中,返回新对象。

const parent = {
  name: 'parent',
  say: function() {
    console.log('Hello, I am ' + this.name);
  }
}

function createChild(obj, name) {
  const child = Object.create(obj);
  child.name = name;
  return child;
}

const child = createChild(parent, 'child');
console.log(child.say()); // "Hello, I am child"

总结

前面介绍了五种 JavaScript 继承模式,每种继承方式都有其优缺点,可以根据具体场景选择不同的继承方式,实现对象的多态。

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

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

相关文章

  • 使用php输出json文件

    以下是关于“使用PHP输出JSON文件”的完整攻略,包含两个示例。 使用PHP输出JSON文件 在PHP中,我们可以使用json_encode()函数将数据转换为JSON格式,并使用header()函数设置Content-Type头来输出JSON文件。以下是两个示例: 1. 输出数组 $data = array( "name" =>…

    other 2023年5月9日
    00
  • 易语言声明变量的步骤讲解

    易语言声明变量的步骤讲解 在易语言中,声明变量是为了给一个数据项分配内存空间,并为其指定一个名称。变量可以存储不同类型的数据,如整数、浮点数、字符串等。下面是易语言声明变量的步骤讲解: 步骤一:选择变量类型 首先,你需要选择适合你的数据的变量类型。易语言提供了多种变量类型,包括整数、浮点数、字符串、布尔值等。根据你的需求,选择合适的变量类型。 以下是一些常见…

    other 2023年8月8日
    00
  • ios12 beta6固件在哪下载 ios12开发者预览版beta6固件下载地址大全

    首先需要澄清一下,iOS 12 beta6 固件只适用于已经注册成为 iOS 开发者的用户。如果你还没有注册成为开发者,那么你需要先注册并获取开发者账号才能下载和安装 iOS 12 beta6。 以下是 iOS 12 beta6 固件下载的完整攻略: 步骤一:登录苹果开发者中心 在浏览器中打开苹果开发者中心,并使用您的 Apple ID 登录。 步骤二:下载…

    other 2023年6月26日
    00
  • js页面加载后执行的几种方式小结

    理解您的需求,本文将为您详细讲解“JS页面加载后执行的几种方式小结”的攻略。JS页面加载后执行代码是我们用来实现页面交互效果,改变DOM节点的状态,增强网站功能等重要手段,因此必须要掌握。 一、使用 window.onload window.onload 是最常用也是最古老的一种方式,它是在网页的所有资源(包括图片和嵌入的 iframe 等)都加载完成后才会…

    other 2023年6月25日
    00
  • Windows Vista 简体中文32位正式版(MSDN)下载

    Windows Vista 简体中文32位正式版(MSDN)下载攻略 1. 确认系统要求 首先,确保你的计算机符合Windows Vista的最低系统要求。以下是Windows Vista的最低系统要求: 处理器:1 GHz 32位(x86)或64位(x64)处理器 内存:1 GB RAM(32位)或2 GB RAM(64位) 硬盘空间:16 GB可用空间(…

    other 2023年7月28日
    00
  • c#progressbar的简单使用

    以下是C# ProgressBar的简单使用攻略,包含两个示例: 步骤1:在窗体中添加ProgressBar控件 在Visual Studio中,您可以在窗体设计器中添加控件。在工具箱中找到ProgressBar控件,然后将其拖放到您的窗中。 步骤2:设置ProgressBar的属性 在窗体设计器中,您可以通过属性窗口设置ProgressBar控件的属性。以…

    other 2023年5月6日
    00
  • 基于HTTP协议实现的小型web服务器的方法

    实现一个基于HTTP协议的小型web服务器,需要考虑以下步骤: 了解HTTP协议 HTTP是一种应用层协议,用于传输Web页面、图片等数据。HTTP协议有请求和响应两部分,客户端首先向服务器发送请求,服务器接收请求后发送响应。具体的HTTP协议内容可以参考RFC2616。 选择编程语言和框架 实现一个小型web服务器,可以使用诸如Python、Node.js…

    other 2023年6月27日
    00
  • 正则表达式模式匹配字符串基础知识

    正则表达式模式匹配字符串基础知识 正则表达式是一种可以用于匹配字符串的模式,它可以用于搜索、替换和验证输入的文本内容。本文将详细讲解正则表达式模式匹配字符串的基础知识,包括正则表达式语法、常用元字符和模式示例等。 正则表达式语法 正则表达式是由普通字符和元字符组成的模式,用于匹配字符串中的文本内容。常见的正则表达式语法包括: 普通字符:表示文本中的普通字符,…

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