javascript面向对象三大特征之继承实例详解

yizhihongxing

JavaScript面向对象三大特征之继承实例详解

在JavaScript中,继承是面向对象编程的一个重要概念。继承可以方便地重用已有代码,并且可以减少代码重复。本文将解释JavaScript中继承的三种方式,并提供详细的示例说明。

继承的三种方式

在JavaScript中,继承有三种方式:

  1. 原型继承 (prototype inheritance)
  2. 构造函数继承 (constructor inheritance)
  3. 组合继承(combination of prototype and constructor inheritance)

原型继承

原型继承是JavaScript中最基本的一种继承方式。在原型继承中,一个对象可以继承另一个对象的属性和方法。具体来说,在原型继承中,一个对象可以通过它的原型链(prototype chain)继承另一个对象的属性和方法。继承的过程中,子对象通过其原型链查找父对象的属性和方法。

下面是一个具体的原型继承的示例:

// 定义父对象 Person
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// 在父对象的原型中添加一个方法
Person.prototype.sayHello = function() {
  console.log(`My name is ${this.name}. I am ${this.age} years old.`);
};

// 定义子对象 Student
function Student(name, age, grade) {
  this.grade = grade;
  Person.call(this, name, age); // 使用call函数继承父对象的属性
}

// 将子对象的原型设置为一个新的父对象的实例,从而继承父对象的方法
Student.prototype = Object.create(Person.prototype);

// 在子对象中添加一个方法
Student.prototype.sayGrade = function() {
  console.log(`My grade is ${this.grade}`);
};

// 创建一个子对象并调用继承自父对象的方法和子对象的方法
const student = new Student("Tom", 15, "A");
student.sayHello(); // My name is Tom. I am 15 years old.
student.sayGrade(); // My grade is A

在上面的示例中,我们定义了一个父对象Person和一个子对象Student。在父对象的原型中,我们添加了一个方法sayHello。在子对象中,我们添加了一个新的属性grade和一个新的方法sayGrade。在子对象的原型中,我们使用Object.create()函数将其原型设置为一个新的父对象实例以继承父对象的方法。我们也使用了Person.call函数来继承父对象的属性。

构造函数继承

构造函数继承是另一种JavaScript中常用的继承方式。在构造函数继承中,一个对象可以通过调用另一个对象的构造函数来继承其属性和方法。具体来说,在构造函数继承中,子对象调用其父对象的构造函数来继承父对象的属性。

下面是一个具体的构造函数继承的示例:

// 定义父对象 Person
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// 在父对象中添加一个方法
Person.prototype.sayHello = function() {
  console.log(`My name is ${this.name}. I am ${this.age} years old.`);
};

// 定义子对象 Student
function Student(name, age, grade) {
  Person.call(this, name, age); // 使用call函数继承父对象的属性
  this.grade = grade;
}

// 创建一个子对象并调用继承自父对象的方法和子对象的方法
const student = new Student("Tom", 15, "A");
student.sayHello(); // TypeError: student.sayHello is not a function

在上面的示例中,我们定义了一个父对象Person和一个子对象Student。在父对象中,我们添加了一个方法sayHello。在子对象中,我们使用了Person.call函数来继承父对象的属性,并添加了一个新的属性grade。但在这个示例里,子对象无法调用父对象的原型方法。这是由于,在这种继承方式中,我们无法继承父对象原型上的属性和方法。

组合继承

组合继承是JavaScript中最常用的继承方式。在组合继承中,一个对象可以同时使用原型继承和构造函数继承。具体来说,在组合继承中,我们先使用构造函数继承来继承父对象的属性,然后使用原型继承来继承父对象的方法。

下面是一个具体的组合继承的示例:

// 定义父对象 Person
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// 在父对象的原型中添加一个方法
Person.prototype.sayHello = function() {
  console.log(`My name is ${this.name}. I am ${this.age} years old.`);
};

// 定义子对象 Student
function Student(name, age, grade) {
  Person.call(this, name, age); // 使用call函数继承父对象的属性
  this.grade = grade;
}

// 将子对象的原型设置为一个新的父对象的实例,从而继承父对象的方法
Student.prototype = Object.create(Person.prototype);

// 修正子对象的原型构造函数指向
Student.prototype.constructor = Student;

// 在子对象中添加一个方法
Student.prototype.sayGrade = function() {
  console.log(`My grade is ${this.grade}`);
};

// 创建一个子对象并调用继承自父对象的方法和子对象的方法
const student = new Student("Tom", 15, "A");
student.sayHello(); // My name is Tom. I am 15 years old.
student.sayGrade(); // My grade is A

在上面的示例中,我们定义了一个父对象Person和一个子对象Student。在父对象的原型中,我们添加了一个方法sayHello。在子对象中,我们使用了Person.call函数来继承父对象的属性,并添加了一个新的属性grade。在子对象的原型中,我们使用Object.create()函数将其原型设置为一个新的父对象实例以继承父对象的方法。我们也使用了Student.prototype.constructor = Student修正子对象的原型构造函数指向。

总结

在JavaScript中,继承有三种常见的方式:原型继承,构造函数继承以及组合继承。不同的继承方式适用于不同的场景。在实际开发中,我们应该选择最适合当前情况的继承方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript面向对象三大特征之继承实例详解 - Python技术站

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

相关文章

  • JS打开层/关闭层/移动层动画效果的实例代码

    下面我分享一下关于JS打开层/关闭层/移动层动画效果的实例代码的完整攻略。 如何打开层 首先在 HTML 文件中添加一个基本的层结构,如下所示: <div id="layer"> <p>这是一个层</p> <button id="closeBtn">关闭</butt…

    JavaScript 2023年6月10日
    00
  • 使用HTML5的表单验证的简单示例

    当用户填写表单时,通常需要对其输入进行验证以确保数据的正确性和完整性。HTML5提供了一些内建的表单验证,可以帮助我们在浏览器端轻松实现表单验证。 下面是一个使用HTML5表单验证的简单示例: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&…

    JavaScript 2023年6月10日
    00
  • JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)

    【JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)】 本篇笔记主要介绍ECMAScript中的其他运算符,包括位运算符、三元操作符以及删除操作符等。 位运算符 位运算符是一种针对二进制数的运算,可以操作二进制数的每一位。在JavaScript中,共有6种位运算符: 按位非(~):按位取反运算符,将每一位二进制数的1换成0,…

    JavaScript 2023年5月27日
    00
  • JavaScript实现浏览器网页自动滚动并点击的示例代码

    JavaScript实现浏览器网页自动滚动并点击的示例代码,可以通过以下步骤完成: 创建一个HTML页面,添加一个button按钮和一个div元素: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>自动滚动并…

    JavaScript 2023年6月11日
    00
  • 行为型:策略模式

    定义   定义一系列的算法,将他们一个个封装起来,使他们直接可以相互替换。   算法:就是写的逻辑可以是你任何一个功能函数的逻辑 封装:就是把某一功能点对应的逻辑给抽出来 可替换:建立在封装的基础上,这些独立的算法可以很方便的替换 通俗的理解就是,把你的算法(逻辑)封装到不同的策略中,在不同的策略中是互相独立的,这样我们封装的每一个算法是可以很方便的复用。 …

    JavaScript 2023年4月18日
    00
  • 分享Javascript中最常用的55个经典小技巧

    分享Javascript中最常用的55个经典小技巧 Javascript是当今最常用的编程语言之一,被广泛应用于Web应用程序、移动应用程序和背后的服务器端。在这里,我们将分享55个最常用的Javascript小技巧,以帮助你在日常编程任务中更高效地使用Javascript。 1. 使用解构语法进行多个变量赋值 在Javascript中,使用解构语法可以一次…

    JavaScript 2023年5月18日
    00
  • JavaScript深入理解节流与防抖

    下面我将为大家详细讲解“JavaScript深入理解节流与防抖”的完整攻略。 1. 什么是节流与防抖 1.1 节流 节流指的是在一定时间内,只执行一次特定操作。比如,在监听 scroll 事件时,用户不断地滚动页面,如果每次都响应该事件那么就会造成性能问题,因此可以通过节流的方式,让该事件在一定时间内只执行一次。 1.2 防抖 防抖指的是在频繁触发某个事件时…

    JavaScript 2023年6月10日
    00
  • js 执行上下文和作用域的相关总结

    JS执行上下文和作用域相关总结 在JavaScript中,代码执行的上下文和作用域是非常重要的概念。正确理解和应用它们可以帮助我们更好地编写和调试JavaScript代码。下面是一个总结: 执行上下文 执行上下文是JavaScript代码执行的环境,其中包括当前执行的代码、变量和对象等,JS 中有三种不同类型的执行上下文:全局上下文,函数上下文,eval上下…

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