彻底理解js面向对象之继承

彻底理解JavaScript面向对象之继承

什么是继承?

在面向对象的编程中,继承是允许一个对象获取另一个对象的属性和方法的过程。可以把继承看做是在已有的类的基础上创建一个新类的过程。

在JavaScript中,继承是通过原型链实现的。每个对象都有一个原型对象,原型对象也可能有一个原型对象,以此类推,直到原型链的顶端为止。当试图访问一个对象的属性或方法时,会先在该对象本身中查找,如果没有找到,就会沿着原型链向上查找,直到找到该属性或方法为止。

继承的实现

在JavaScript中,可以使用以下几种方式来实现对象的继承:

1. 原型链继承

原型链继承是JavaScript中最常用的继承方式之一,通过将父类的实例赋值给子类的原型对象,子类就能够访问父类的属性和方法,从而实现了继承。

示例代码如下:

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

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}, I'm ${this.age} years old.`);
}

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

// 继承 Person
Student.prototype = new Person();

// 将 constructor 指回 Student
Student.prototype.constructor = Student;

const student = new Student('Tom', 18, 'Grade1');
console.log(student.name); // Tom
console.log(student.age); // 18
console.log(student.grade); // Grade1
student.sayHello(); // Hello, my name is Tom, I'm 18 years old.

2. 构造函数继承

构造函数继承是通过在子类的构造函数中调用父类的构造函数来实现继承。通过使用call或apply方法,给父类传递子类的this对象,使得父类的属性和方法都能够在子类中使用。

示例代码如下:

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

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}, I'm ${this.age} years old.`);
}

function Student(name, age, grade) {
  // 调用 Person
  Person.call(this, name, age);
  this.grade = grade;
}

const student = new Student('Tom', 18, 'Grade1');
console.log(student.name); // Tom
console.log(student.age); // 18
console.log(student.grade); // Grade1
student.sayHello(); // TypeError: student.sayHello is not a function

由于构造函数继承只能继承父类的属性,无法继承父类的原型方法,所以在使用构造函数继承时,父类的方法不能通过prototype定义,需要在构造函数中定义。

3. 组合继承

组合继承是同时使用原型链继承和构造函数继承的方式,在构造函数中调用父类构造函数传递this对象,并将父类原型对象赋值给子类的原型对象。

示例代码如下:

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

Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}, I'm ${this.age} years old.`);
}

function Student(name, age, grade) {
  // 调用 Person
  Person.call(this, name, age);
  this.grade = grade;
}

// 继承 Person 的原型方法
Student.prototype = new Person();

// 将 constructor 指回 Student
Student.prototype.constructor = Student;

const student = new Student('Tom', 18, 'Grade1');
console.log(student.name); // Tom
console.log(student.age); // 18
console.log(student.grade); // Grade1
student.sayHello(); // Hello, my name is Tom, I'm 18 years old.

总结

以上就是JavaScript中实现继承的几种方式,不同的继承方式具有不同的优劣性,可以根据实际场景来选择适合的方式。

继承是面向对象编程中非常重要的概念,对于JavaScript开发者来说,更要深入理解和应用继承,才能更好地进行代码设计和重用。

示例

下面给出一个使用原型链继承的示例:

function Animal(name, type) {
  this.name = name;
  this.type = type;
}

Animal.prototype.sayHello = function() {
  console.log(`I'm a ${this.type}, my name is ${this.name}`);
}

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

// 继承自 Animal
Cat.prototype = new Animal();

// 将 constructor 指回 Cat
Cat.prototype.constructor = Cat;

// 自定义方法
Cat.prototype.scratch = function() {
  console.log(`${this.name} is scratching.`);
}

const cat = new Cat('Tom');
cat.sayHello(); // I'm a undefined, my name is Tom
cat.scratch(); // Tom is scratching.

在上面的示例中,Cat继承自Animal,原型链上能够访问到Animal的方法sayHello,同时Cat还定义了一个自己的方法scratch。

阅读剩余 69%

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

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

相关文章

  • javascript 按回车键相应按钮提交事件

    要使得在输入框中按下回车键能够提交表单,可以分为以下几个步骤: 找到输入框的 DOM 元素。 给输入框添加 onkeydown 事件监听器。 在事件监听器中判断按下的是否为回车键。 如果是回车键,则阻止默认行为(即防止换行),并执行相应的提交表单操作。 下面按照具体的方法和示例一步步进行讲解。 1. 找到输入框的 DOM 元素 首先,需要找到要对其添加事件监…

    JavaScript 2023年6月10日
    00
  • 详解vue route介绍、基本使用、嵌套路由

    让我们来详细讲解一下Vue Route的相关信息。 1. 什么是Vue Route Vue Route是Vue.js官方提供的用于实现客户端路由的插件。它实现了基于组件的路由,使得我们可以通过改变URL的方式来呈现不同的页面内容,从而实现单页应用(SPA)的路由系统。 2. 基本使用 为了使用Vue Route,我们需要在Vue项目中先安装它。我们可以通过在…

    JavaScript 2023年6月11日
    00
  • JS中apply()的应用实例分析

    JS中apply()的应用实例分析 什么是apply()? JS中的apply()是Function对象自带的一个方法,它的作用是调用函数并将对象作为第一个参数进行传递,第二个参数是一个包含传递给函数的参数的数组。 语法:function.apply(thisArg, [argsArray]) thisArg:在函数中某个对象将被用作“this”对象。 ar…

    JavaScript 2023年5月28日
    00
  • javascript中神奇的 Date对象小结

    让我用Markdown格式为您撰写关于“javascript中神奇的 Date对象小结”的完整攻略吧。 JavaScript中神奇的Date对象小结 Date对象时JavaScript中用来处理日期和时间的内置对象,它允许我们创建、操作和格式化日期和时间。在这份攻略中,我们将深入了解Date对象的相关应用。 创建Date对象 要创建Date对象,我们简单地使…

    JavaScript 2023年6月10日
    00
  • 深入了解Javascript的事件循环机制

    深入了解JavaScript的事件循环机制 JavaScript 是一门单线程语言,这意味着在 JavaScript 中,代码是按顺序执行的,只有前一个任务执行完成后,才会执行下一个任务。但是 JavaScript 中有许多异步操作,如定时器、事件监听器、网络请求等,这些操作不会阻塞代码的执行,可以同时执行。那么在 JavaScript 中是如何处理异步操作…

    JavaScript 2023年5月28日
    00
  • javascript实现的动态添加表单元素input,button等(appendChild)

    JavaScript中使用appendChild()方法可以动态添加HTML元素。该方法可以将新建的元素节点添加到指定父级节点的最后一个子节点后面。以下是详细的攻略: 步骤 首先需要获取到需要添加元素的父节点对象,可以使用document.getElementById()方法或其它方法获取。 创建需要添加的元素节点对象,例如创建一个input元素节点,可以使…

    JavaScript 2023年6月10日
    00
  • javascript之Array 数组对象详解

    JavaScript之Array数组对象详解 什么是数组 在 JavaScript 中,数组(Array)是一种复合数据类型,用于存储一组有序的数据。可以将数组看作是一个盒子,该盒子中可以存放多个数据,而且这些数据是有序的,通过下标(索引)来访问每一个数据。 数组的创建 JavaScript 中,可以使用两种方式来创建数组: 1. 使用字面量方式创建数组 l…

    JavaScript 2023年5月27日
    00
  • JavaScript中的原始值和复杂值

    JavaScript中的原始值和复杂值 在JavaScript中,数据类型可以分为两种:原始值和复杂值。 原始值 原始值是最基本的数据类型,它们是不可变的。JavaScript中有5种原始值: 字符串(String):用双引号(”)或单引号(’)包含的字符序列,例如:”Hello World”或’My Name is Peter’。 数字(Number):整…

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