JavaScript面向对象之Prototypes和继承

yizhihongxing

JavaScript面向对象之Prototypes和继承

JavaScript是一门支持面向对象编程的语言,原型(prototype)是JavaScript中非常重要的一个概念。在这篇文章中,我们将讲解JavaScript中的原型、原型链以及如何使用原型实现继承。

1. 构造函数与原型

在JavaScript中,每个函数都有一个prototype属性,这个属性指向了一个对象,我们称之为原型对象。

比如下面这个例子中:

function Person(name) {
  this.name = name;
}

Person.prototype.sayName = function() {
  console.log('My name is ' + this.name);
}

var person = new Person('Tom');

在这个例子中,Person就是一个构造函数,person是一个对象实例。构造函数的原型对象Person.prototype上添加了一个方法sayName,那么person对象实例在执行sayName时,就可以找到它的原型链上的Person.prototype对象的sayName方法,从而成功执行。

2. 原型链

那么什么是原型链呢?实际上,每个对象实例都有一个__proto__属性,它指向了该对象的构造函数的原型对象,构成了一个原型链。如果我们在一个对象上找不到某个属性或者方法,JavaScript就会从原型链上继续往上查找,直到找到为止。

那么我们来看下面这个例子:

function Person(name) {
  this.name = name;
}

Person.prototype.sayName = function() {
  console.log('My name is ' + this.name);
}

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

// 这里需要将原型链指向Person.prototype,然后再定义新的方法
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

Student.prototype.sayGrade = function() {
  console.log('My grade is ' + this.grade);
}

var student = new Student('Tom', 3);

在这个例子中,我们定义了一个Person构造函数和一个Student构造函数,Student构造函数继承于Person构造函数。那么在Student的原型链中,先是Student.prototype,然后是Person.prototype,最后是Object.prototype。

因此当我们调用student.sayName时,JavaScript先在student对象上查找,发现没有该方法,于是它会去在student.__proto__指向的Person.prototype中查找,找到了该方法之后,就可以成功执行了。而当我们调用student.sayGrade时,student对象上就会直接找到该方法,从而成功执行。

3. 示例说明

接下来,我们将通过两个示例分别说明如何使用原型和原型链进行继承。

示例1:原型继承

在JavaScript中,我们可以使用原型对象进行继承。比如下面这个例子中:

function Person(name) {
  this.name = name;
}

Person.prototype.sayName = function() {
  console.log('My name is ' + this.name);
}

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

Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

var student = new Student('Tom', 3);
student.sayName();

在这个例子中,我们首先定义了一个Person构造函数,然后在Student构造函数中调用了Person的构造函数,从而继承它的属性。接着我们将Student构造函数的原型对象指向了Person的原型对象,从而实现了继承Person原型对象上的方法。

最后,在实例化一个student对象后,我们可以成功调用继承了来自Person的原型对象的sayName方法。

示例2:组合继承

在JavaScript中,我们还可以使用组合继承的方式进行继承,如下面这个例子:

function Person(name) {
  this.name = name;
}

Person.prototype.sayName = function() {
  console.log('My name is ' + this.name);
}

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

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

var student = new Student('Tom', 3);
student.sayName();

在这个例子中,我们也定义了一个Person构造函数和一个Student构造函数。不同的是,在Student构造函数中,我们使用Person.call(this, name)继承了Person构造函数的属性,并通过将Student.prototype指向new Person()来继承了Person构造函数的原型对象。

最后,在实例化一个student对象后,通过调用sayName方法,我们同样可以成功访问继承来自Person的原型对象的sayName方法。

至此,我们已经讲解了JavaScript中的原型和原型链,并通过两个示例分别说明了如何使用原型和原型链进行继承。通过对原型和原型链的深入理解,我们可以更好地理解和设计JavaScript中的面向对象程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript面向对象之Prototypes和继承 - Python技术站

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

相关文章

  • JavaScript ParseFloat()方法

    当需要把字符串转化成 JavaScript 中的数字类型时,可以使用 JavaScript 中的 parseFloat() 方法。这个方法可以把一个字符串中的首个数字或小数点开头的数字转换成浮点型数据(float)。 1. 语法 parseFloat(string) 其中,string 为需要被解析的字符串参数。 2. 示例 2.1. 解析包含整数的字符串 …

    JavaScript 2023年5月28日
    00
  • JavaScript事件处理程序(事件侦听器)

    JavaScript事件处理程序(也被称为“事件侦听器”)就是一段代码,当事件发生时会被执行。可以使用HTML中的on-属性来绑定JavaScript事件处理程序,也可以使用JavaScript中的addEventListener()方法来绑定。下面就让我们来详细讲解一下JavaScript事件处理程序的完整攻略: 什么是事件处理程序? 事件处理程序就是一段…

    JavaScript 2023年5月27日
    00
  • JavaScript数组、json对象、eval()函数用法实例分析

    接下来我将详细讲解“JavaScript数组、JSON对象、eval()函数用法实例分析”的完整攻略。 一、JavaScript数组 1.1 定义数组 JavaScript数组是一种数据类型,用于存储多个数据,可以是数值、字符串、对象等。定义一个数组可以使用以下语法: var myArray = new Array(); // 使用 new 操作符创建一个空…

    JavaScript 2023年5月27日
    00
  • JavaScript 实现HTML DOM增删改查操作的常见方法详解

    JavaScript 实现HTML DOM增删改查操作的常见方法详解 1. DOM简介 DOM全称“Document Object Model”,中文翻译为文档对象模型,是一种对文档结构化的方式表达,即将文档中的每一个元素都抽象成为一个对象,便于JavaScript等脚本语言进行操作。 DOM是Web页面的编程接口,可以使用JavaScript、VBScri…

    JavaScript 2023年6月10日
    00
  • 如何用JS追踪用户

    下面是关于如何用JS追踪用户的完整攻略: 1. 获取用户信息 我们可以使用JS来获取用户的一些相关信息,如用户的浏览器信息、设备信息、操作系统信息等。例如,我们可以使用以下代码来获取用户的浏览器名称及版本: var browser = navigator.userAgent.toLowerCase(); if (browser.indexOf("m…

    JavaScript 2023年5月27日
    00
  • bootstrap日期插件daterangepicker使用详解

    Bootstrap日期插件daterangepicker使用详解 介绍 Daterangepicker是一个Bootstrap风格的日期范围选择器插件。它可以让用户直接在页面上快速选择时间段,而不需要手动输入。它可以与Moment.js和jQuery结合起来使用。本篇攻略将介绍如何使用Daterangepicker插件进行日期范围选择。 步骤 1.获取插件 …

    JavaScript 2023年6月10日
    00
  • 微信JSSDK调用微信扫一扫功能的方法

    针对您提供的话题,我来详细讲解一下微信JSSDK调用微信扫一扫功能的方法的完整攻略。 一、前置准备 要完成微信JSSDK调用微信扫一扫功能,需要提前完成以下几个步骤: 申请微信公众号。在微信公众平台上申请并审核通过公众号。 拥有有效的微信公众号开发者身份。在微信公众平台上注册并审核通过开发者账号,并进行开发者认证。 获得合法的微信JS-SDK权限。即在微信公…

    JavaScript 2023年6月10日
    00
  • JS中使用FormData上传文件、图片的方法

    当需要在JavaScript中使用FormData对象来完成文件或者图片上传时,可以按照以下步骤进行: 创建FormData对象 可以通过new FormData()创建一个空的FormData对象。 let formData = new FormData(); 添加要上传的文件或者图片 使用append()方法向formData对象中添加要上传的文件或者图…

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