JavaScript面向对象之Prototypes和继承

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 dom 操作详解 js加强

    Javascript DOM 操作详解 简介 DOM(Document Object Model),即文档对象模型,是指HTML或XML文件的一个存储模型。使用DOM,我们可以通过Javascript来操作网页上的内容和结构,实现动态效果。本文旨在介绍Javascript DOM的相关知识,包括节点遍历、元素获取、属性操作、样式操作、事件绑定等内容。 节点遍…

    JavaScript 2023年5月27日
    00
  • js 数组克隆方法 小结

    以下是关于“js 数组克隆方法 小结”的完整攻略: 标准的数组克隆方式 在JavaScript中,有两种标准的数组克隆方式: 利用ES6的扩展运算符(…) const arr1 = [1, 2, 3]; const arr2 = […arr1]; console.log(arr1); // [1, 2, 3] console.log(arr2); /…

    JavaScript 2023年5月27日
    00
  • JS简单实现查看文档创建日期、修改日期和文档大小的方法示例

    下面是 “JS简单实现查看文档创建日期、修改日期和文档大小的方法示例” 的完整攻略。 1.获取文档创建日期和修改日期 要获取文档创建日期和修改日期,我们可以使用 JavaScript 中的 Date 和 Document 对象。 首先,我们需要获取文档的最后修改时间和创建时间。下面是一个简单的 JS 代码示例。 // 获取文档最后修改时间和创建时间 var …

    JavaScript 2023年5月27日
    00
  • javascript 常用验证函数总结

    JavaScript常用验证函数总结 在JavaScript开发中,我们通常需要对用户输入的数据进行验证,以确保应用程序的安全性和正确性。为了方便验证,JavaScript中提供了一些常用的验证函数。下面对这些函数进行总结。 数字类 isFinite() isFinite()函数用于检查一个数值是否无穷大。 示例: console.log(isFinite(…

    JavaScript 2023年5月19日
    00
  • 浅谈React Router关于history的那些事

    浅谈React Router关于history的那些事 React Router是React中最流行的路由库之一,用于在React应用程序中管理不同URL之间的转换。其中一个重要的概念是history,它是实际实现路由的技术基础。本文将重点讲解React Router中关于history的那些事。 history是什么 首先,我们需要了解什么是history…

    JavaScript 2023年6月11日
    00
  • Javascript继承(上)——对象构建介绍

    Javascript继承(上)——对象构建介绍 概述 在Javascript中,继承是一种重要的特性。通过继承,我们可以复用已有代码,并且在不改变原有代码的前提下,扩展和改进功能。 本文将介绍Javascript中的对象构建方式,从而为后续讲解继承做好铺垫。 对象创建 在Javascript中可以通过以下方式创建对象: 1.对象字面量 对象字面量是一种简单的…

    JavaScript 2023年5月27日
    00
  • jquery带动画效果幻灯片特效代码

    下面是jquery带动画效果幻灯片特效代码的完整攻略: 步骤一:引入jQuery库文件 在网站页面的head部分中引入jQuery库文件。可以使用jQuery官网提供的cdn链接或将jQuery库文件下载到本地并引入。 例如,使用cdn链接的方式: <head> <script src="https://cdn.bootcdn.n…

    JavaScript 2023年6月11日
    00
  • nodejs中的fiber(纤程)库详解

    Node.js 中的 Fiber(纤程)库详解 什么是 Fiber Fiber 是一个用于实现协程的库。协程是一种用户级线程,可以在同一个进程内实现多个协程并发执行,从而实现更高效的 I/O 操作。在 Node.js 中,I/O 操作是异步的,使用回调函数等方式来进行异步调用。Fiber 可以让我们使用同步的方式来编写异步的代码,从而简化程序逻辑。 Fibe…

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