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

yizhihongxing

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

相关文章

  • 使用SWFObject完美解决HTML插入Flash的各浏览器兼容性方案

    使用SWFObject插入Flash可以通过JavaScript动态生成Flash对象,并通过检测当前浏览器是否支持HTML5的canvas元素,自动选择使用原生HTML5的canvas元素或者使用Flash来显示动画。这种方法可以解决HTML插入Flash的各浏览器兼容性问题,并且也可以提高网站的性能。 以下是使用SWFObject完美解决HTML插入Fl…

    JavaScript 2023年6月10日
    00
  • axios拦截器、ElementUI组件的使用方法

    axios拦截器使用方法 1. 安装Axios Axios是一个基于Promise的HTTP库,可以在浏览器和Node.js中使用。安装Axios,请在命令行输入以下命令: npm install axios 2. 添加拦截器 可以使用Axios的拦截器来在请求或响应被处理前拦截它们。 以下是一个示例,向请求头中添加Authorization: import…

    JavaScript 2023年6月10日
    00
  • 你有必要知道的10个JavaScript难点

    你有必要知道的10个JavaScript难点 1. 变量提升 JavaScript 中的变量提升是指 JS 引擎将变量声明提升到作用域的顶部,即在变量声明之前就能访问该变量。变量提升会造成变量值的不确定性,应该格外注意。 例如: x = 5; console.log(x); var x; 这个例子中,虽然变量 x 的值在声明之前被赋值为 5,但是在变量声明之…

    JavaScript 2023年5月18日
    00
  • js parentElement和offsetParent之间的区别

    js parentElement和offsetParent之间的区别 在使用 JavaScript 操作 DOM(文档对象模型)时,我们经常会遇到 parentElement 和 offsetParent 这两个属性,这两个属性都可以用来访问一个元素的父级元素。虽然它们看起来很相似,但它们有着不同的工作方式和用途。 parentElement parentE…

    JavaScript 2023年6月10日
    00
  • js left,right,mid函数

    JS中并没有原生提供left,right和mid函数,但我们可以通过JS的字符串方法来模拟实现这些功能。 left函数 left函数用来返回字符串的前n个字符,我们可以使用如下代码实现: function left(str, n) { if (n <= 0) { return ""; } else if (n > str.le…

    JavaScript 2023年5月27日
    00
  • 使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)

    下面就为您详细讲解如何使用JavaScript实现网页秒表功能。 一、制作基本网页结构 首先,在HTML文件中添加一个包含开始、暂停、继续、重置按钮和显示计时时间的元素。具体代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> …

    JavaScript 2023年5月27日
    00
  • JavaScript 对象成员的可见性说明

    JavaScript 对象成员的可见性是指对象中的属性和方法在不同情况下是否可以被访问到。在JS中,以下是对象成员的可见性说明: 公共成员 公共成员是对象中可以被外部访问到的属性和方法。在定义对象时,可以在对象的原型上定义公共成员,例如: function Person(name, age) { this.name = name; this.age = ag…

    JavaScript 2023年5月27日
    00
  • Yii实现复选框批量操作实例代码

    让我来为您详细讲解“Yii实现复选框批量操作实例代码”的完整攻略。 1. 确定需求 在开始编码之前,我们需要先确定需求,即我们需要实现什么功能。在这个案例中,我们需要实现一个复选框批量操作的功能,通过选中多个复选框,批量对这些数据进行操作,比如删除多个记录,修改多个记录的某个属性等。 2. 配置GridView 首先,我们需要配置一个GridView来显示我…

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