js继承的6种方式详解

以下是js继承的六种方式的详细攻略。

1. 原型链继承

原型链继承是JavaScript中最基本的继承方式之一,它通过将父类的实例对象作为子类的原型对象来实现继承。这种方式的缺点是,所有子类实例对象共享同一个原型对象,当父类原型对象中的引用类型属性被修改时,所有子类实例对象中对应属性的值都会同时改变,这个缺点也被称之为“原型污染”问题。

示例代码如下:

function Person(name) {
  this.name = name;
  this.friends = ["Ben", "Tom"];
}

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

function Student() {}

Student.prototype = new Person("Jack");
Student.prototype.constructor = Student;

var s1 = new Student();
s1.friends.push("Mike");
console.log(s1.friends); // 输出 ["Ben", "Tom", "Mike"]

var s2 = new Student();
console.log(s2.friends); // 输出 ["Ben", "Tom", "Mike"]

2. 构造函数继承

构造函数继承是通过借用父类构造函数来实现继承。这种方式解决了原型链继承中“原型污染”的问题,但带来的另外一个问题是,每个子类实例对象都会拥有一份自己的父类属性副本,而且无法继承父类原型对象上的属性和方法。

示例代码如下:

function Person(name) {
  this.name = name;
  this.friends = ["Ben", "Tom"];
}

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

function Student(name, grade) {
  Person.call(this, name);
  this.grade = grade;
}

var s1 = new Student("Jack", 1);
s1.friends.push("Mike");
console.log(s1.friends); // 输出 ["Ben", "Tom", "Mike"]

var s2 = new Student("Tom", 2);
console.log(s2.friends); // 输出 ["Ben", "Tom"]

3. 组合继承

组合继承是原型链继承和构造函数继承的组合使用,它通过借用父类构造函数来继承父类实例属性,通过将父类构造函数的实例对象作为子类原型对象来继承父类原型属性,从而既解决了“原型污染”问题,又避免了每个子类实例对象都拥有一份自己的父类属性副本的问题。

示例代码如下:

function Person(name) {
  this.name = name;
  this.friends = ["Ben", "Tom"];
}

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

function Student(name, grade) {
  Person.call(this, name);
  this.grade = grade;
}

Student.prototype = new Person();
Student.prototype.constructor = Student;

var s1 = new Student("Jack", 1);
s1.friends.push("Mike");
console.log(s1.friends); // 输出 ["Ben", "Tom", "Mike"]

var s2 = new Student("Tom", 2);
console.log(s2.friends); // 输出 ["Ben", "Tom"]

4. 原型式继承

原型式继承是借助原型链继承的方式来实现对象之间的继承关系。它通过创建一个临时性的构造函数,将传入的对象作为这个构造函数的原型对象来创建新的对象,从而实现继承。

示例代码如下:

var person = {
  name: "Jack",
  friends: ["Ben", "Tom"]
};

var student = Object.create(person);
student.grade = 1;

var student2 = Object.create(person);
student2.grade = 2;

student.friends.push("Mike");
console.log(student.friends); // 输出 ["Ben", "Tom", "Mike"]

console.log(student2.friends); // 输出 ["Ben", "Tom", "Mike"]

5. 寄生式继承

寄生式继承是基于原型式继承的一种增强版,它利用一个虚构的构造函数,在原型式继承的基础上添加了一些新的属性和方法,并返回这个虚构的构造函数。

示例代码如下:

function createStudent(person, grade) {
  var student = Object.create(person);
  student.grade = grade;

  student.sayGrade = function() {
    console.log(this.grade);
  };

  return student;
}

var person = {
  name: "Jack",
  friends: ["Ben", "Tom"]
};

var student = createStudent(person, 1);
student.friends.push("Mike");
console.log(student.friends); // 输出 ["Ben", "Tom", "Mike"]

6. 寄生组合式继承

寄生组合式继承是通过组合继承和寄生式继承的方式来实现继承。这种方式解决了组合继承中重复执行父类构造函数的问题,并且避免了父类构造函数中实例属性被重复定义的问题。

示例代码如下:

function Person(name) {
  this.name = name;
  this.friends = ["Ben", "Tom"];
}

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

function Student(name, grade) {
  Person.call(this, name);
  this.grade = grade;
}

function inheritPrototype(subType, superType) {
  var prototype = Object.create(superType.prototype);
  prototype.constructor = subType;
  subType.prototype = prototype;
}

inheritPrototype(Student, Person);

var s1 = new Student("Jack", 1);
s1.friends.push("Mike");
console.log(s1.friends); // 输出 ["Ben", "Tom", "Mike"]

var s2 = new Student("Tom", 2);
console.log(s2.friends); // 输出 ["Ben", "Tom"]

希望以上内容能够帮助您更好地理解JavaScript中的继承方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js继承的6种方式详解 - Python技术站

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

相关文章

  • C语言表达式求值中类型转换和优先级等问题详解

    C语言表达式求值中类型转换和优先级等问题详解 1. 类型转换 在C语言表达式求值的过程中,会涉及到不同类型的操作数之间的计算和赋值。为了保证计算的准确性和一致性,C语言会自动进行类型转换。 类型转换可以分为隐式类型转换和显式类型转换两种方式。 1.1 隐式类型转换 隐式类型转换是指在表达式中,将一个较小的数据类型自动转换为较大的数据类型,这种转换可以通过自动…

    other 2023年6月28日
    00
  • burpsuite的使用(一)

    BurpSuite的使用(一) BurpSuite是一款常用的Web应用安全测试工具,同时也是将安全问题演示给开发者、渗透测试人员等人员的必备工具之一。本文将介绍BurpSuite的基本使用方法:如何使用代理拦截请求,发送请求并对响应进行分析等操作。 下载与安装 BurpSuite官方网站:https://portswigger.net/burp/commu…

    其他 2023年3月28日
    00
  • Mac M1安装mnmp(Mac+Nginx+MySQL+PHP)开发环境

    安装mnmp(Mac+Nginx+MySQL+PHP)开发环境攻略 以下是在Mac M1芯片上安装mnmp开发环境的详细步骤: 步骤1:安装Homebrew 打开终端应用程序。 在终端中输入以下命令并按下回车键来安装Homebrew: bash /bin/bash -c \”$(curl -fsSL https://raw.githubusercontent…

    other 2023年10月13日
    00
  • pyside+pyqt实现鼠标右键菜单功能

    下面是详细的攻略: 使用PySide/PyQt实现鼠标右键菜单功能 鼠标右键菜单指的是当用户在界面上使用鼠标右键点击某个控件时,弹出的下拉菜单,用于提供与该控件相关的操作选项。 使用PySide/PyQt可以方便快捷地实现鼠标右键菜单功能,下面是具体的步骤: 第一步:创建菜单 使用QMenu类创建菜单,并添加菜单项(QAction): menu = QMen…

    other 2023年6月27日
    00
  • easyuicombobox默认选中

    以下是“EasyUI Combobox默认选中”的完整攻略: EasyUI Combobox默认选中 在EasyUI中,我们可以使用Combobox组件来创建下拉列表。以下是如何设置Combobox默认选中的步骤: 1. 设置默认值 可以使用value属性来设置Combobox的默认值。例如,可以使用以下代码: <input class="e…

    other 2023年5月7日
    00
  • win11本地帐号名称怎么更改? win11修改本地账户名称的技巧

    以下是win11本地账户名称修改的攻略: 1. 打开控制面板 首先,进入windows 11系统的控制面板。在搜索框中输入“控制面板”,然后点击打开。 2. 选择“用户帐户” 在控制面板中,选择“用户帐户”,然后选择“更改帐户类型”。 3. 选择要更改的本地账户 在“更改帐户类型”界面中,选择需要更改名称的本地账户。点击账户名称旁边的“更改帐户名称”按钮。 …

    other 2023年6月27日
    00
  • 微信小程序canvas生成并保存图片

    微信小程序canvas生成并保存图片 微信小程序提供了一种非常方便的方式来绘制图片:使用canvas。本文将介绍如何在小程序中使用canvas来生成并保存图片。 准备工作 在编写代码之前,我们需要在小程序根目录下新建一个canvas文件夹,用于存放绘制图片所需的资源,包括图像,字体等等。 绘制图片 在小程序中使用canvas绘制图片需要经过以下步骤: 创建c…

    其他 2023年3月29日
    00
  • Android自定义ViewGroup嵌套与交互实现幕布全屏滚动

    Android自定义ViewGroup嵌套与交互实现幕布全屏滚动攻略 在本攻略中,我们将详细讲解如何使用自定义ViewGroup来实现幕布全屏滚动,并实现交互效果。我们将使用两个示例来说明这个过程。 步骤1:创建自定义ViewGroup 首先,我们需要创建一个自定义的ViewGroup来实现幕布全屏滚动。我们可以继承现有的ViewGroup类,例如Linea…

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