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日

相关文章

  • Python中还原JavaScript的escape函数编码后字符串的方法

    下面是详细讲解 Python 中还原 JavaScript 的 escape 函数编码后字符串的方法的完整攻略: 1. 什么是 JavaScript 的 escape 函数? JavaScript 的 escape 函数是一种将字符串编码成可在 URL 中传输的形式的方法。该函数可以用来防止 URL 路径中出现非法字符或中文字符时乱码。它会将非 ASCII …

    JavaScript 2023年5月19日
    00
  • 详细聊聊JavaScript是如何影响DOM树构建的

    JavaScript 是一门动态、基于事件驱动的脚本语言,被广泛应用于网页交互验证、动态效果实现等方面。同时,JavaScript 也有着非常重要的作用,就是影响 DOM 树的构建。 DOM(文档对象模型)是指文档的对象表示法,是一种用于表示 XML 或 HTML 文档的内部结构树,它由节点(节点是指文档中至少有一个位置的名称)和对象组成,节点包括元素节点、…

    JavaScript 2023年6月10日
    00
  • js 取时间差去掉周六周日实现代码

    要计算时间差并去掉周六周日,我们可以使用 JavaScript 内置的 Date 对象,它提供了许多方法来处理日期和时间。以下是实现这个功能的步骤: 获取开始时间和结束时间的 Date 对象。 我们可以使用 Date 对象的构造函数来创建具有指定日期和时间的日期对象。例如,我们可以这样创建一个代表 2021 年 1 月 1 日的 Date 对象:new Da…

    JavaScript 2023年5月27日
    00
  • 利用layer实现表单完美验证的方法

    利用layer实现表单完美验证的方法: 为了实现表单验证,我们需要引入layer插件,然后编写相关的代码。下面是详细的攻略: 1. 引入layer插件 在页面头部引入layer插件的js和css代码,例如: <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/…

    JavaScript 2023年6月10日
    00
  • 你不知道的 javascript【推荐】

    你不知道的 Javascript【推荐】攻略 1. 简介 你不知道的 Javascript 是一本非常优秀的JavaScript教程,分为上下两册,包含了JavaScript的许多高阶概念和一些常见误解,非常适合深入学习Javascript的开发者。本教程文字讲解详细,理论与实践相结合,是你深入学习Javascript的好帮手。 2. 内容概述 上册 上册主…

    JavaScript 2023年5月18日
    00
  • jQuery中调用WebService方法小结

    下面是详细的“jQuery中调用WebService方法小结”的攻略: 1. 了解 jQuery.ajax() 方法 在调用 WebService 方法前,首先需要了解 jQuery 提供的核心方法 jQuery.ajax()。该方法通过异步 HTTP(Ajax)请求从服务器上加载数据。 $.ajax({ url: "WebService路径&qu…

    JavaScript 2023年6月11日
    00
  • JS动态给对象添加属性和值的实现方法

    下面是关于“JS动态给对象添加属性和值的实现方法”的完整攻略: 方式一:使用点运算符添加属性 使用点运算符添加属性非常简单,只需要在对象后加上”.”,紧接着加上新增的属性名,再赋予一个值即可。 示例一: let person = { name: ‘张三’, age: 25 }; person.gender = ‘男’; console.log(person)…

    JavaScript 2023年5月27日
    00
  • JS 创建对象的模式实例小结

    下面是关于“JS 创建对象的模式实例小结”的完整攻略,其中包含两个示例说明: JS 创建对象的模式实例小结 在 JavaScript 中,创建对象有多种模式,不同的模式适用于不同的场景和需求。本文将对常见的四种创建对象的模式做一个简单介绍和小结,方便读者选择合适的模式进行对象创建。 一、工厂模式 工厂模式通过工厂方法创建对象,将创建对象的过程封装在一个函数中…

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