彻底理解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。

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

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

相关文章

  • ES6中async函数与await表达式的基本用法举例

    下面是关于ES6中async函数与await表达式的基本用法及示例说明的完整攻略。 什么是async函数与await表达式 在ES6中,async函数是用来简化异步代码的一种新语法,它是Generator函数的语法糖。async函数返回一个Promise对象,可以使用then方法添加回调函数。同时,async函数内部可以使用await表达式,它用于等待一个P…

    JavaScript 2023年5月27日
    00
  • JavaScript 数组常见操作技巧 (二)

    下文将为您详细讲解“JavaScript 数组常见操作技巧 (二)”的完整攻略。 一、Array.prototype.map() map()方法将数组中的每个元素映射为一个新的元素,最终返回一个映射后的新数组,并不会影响原数组的元素。该方法接收一个回调函数作为参数,回调函数接受三个参数(当前元素的值,当前元素的索引和原数组),并返回一个新值。 下面是一个示例…

    JavaScript 2023年6月10日
    00
  • Javascript Date getUTCMonth() 方法

    JavaScript 中的 getUTCMonth() 方法用于获取 UTC 时间的月份部分。在本教程中,我们将详细介绍 getUTCMonth() 方法的使用方法。 getUTCMonth() 方法的基本语法如下: date.getUTCMonth() 其中,date 是获取月份部分的 UTC 日期对象。 以下两个示例说明: 示例一:使用 getUTCMo…

    JavaScript 2023年5月11日
    00
  • JavaScript中ES6字符串扩展方法

    下面是关于JavaScript中ES6字符串扩展方法的详细攻略: 概述 ES6中提供了许多新的字符串操作方法,其中包括字符串的模板字面量、字符串查找和替换、字符串复制、字符串格式化输出等。这些方法能够帮助我们更灵活、更高效地操作字符串。 模板字面量 模板字面量是ES6中新增的字符串表示方法,使用反引号(`)括起来的字符串模板可以添加表达式和换行符。 用法示例…

    JavaScript 2023年5月28日
    00
  • 从URL中提取参数与将对象转换为URL查询参数的实现代码

    从URL中提取参数的实现代码 通过JavaScript代码解析URL获取参数是一种很常见的操作,我们可以通过以下操作来提取URL中的参数: 1.使用window.location.search获取查询字符串部分,该部分包含了所有请求参数。例如,我们可以使用以下代码来获取URL地址中的search字符串: let searchStr = window.loca…

    JavaScript 2023年6月11日
    00
  • javascript使用window.name解决跨域问题第2/2页

    JavaScript使用window.name解决跨域问题是一种比较简单易用的跨域解决方案。下面我将详细讲解此攻略的完整过程。 一、什么是跨域问题? 跨域问题(Cross-Domain)是指在进行web开发时,如果一个网页嵌入了来自其他域的资源,如通过Ajax、Frame、Image等方式跨域访问,由于浏览器的同源策略安全限制,将会导致跨域访问出现许多问题。…

    JavaScript 2023年6月11日
    00
  • JS实现倒计时和文字滚动的效果实例

    请看下方内容。 JS 实现倒计时效果 HTML 结构 首先,我们需要在 HTML 中创建一个对应的元素,用于显示倒计时效果,例如: <div id="countdown"></div> JS 代码实现 然后,我们需要编写 JS 代码来控制倒计时效果。具体实现过程如下: 初始化倒计时时间 let countDownD…

    JavaScript 2023年6月11日
    00
  • JavaScript中的Primitive对象封装介绍

    下面是“JavaScript中的Primitive对象封装介绍”的完整攻略。 什么是Primitive对象 JavaScript中存在两种数据类型:原始数据类型和引用数据类型。其中原始数据类型又称为Primitive类型,包括Number、String、Boolean、Null、Undefined和Symbol(ES6新增)。 Primitive对象是Jav…

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