Javascript中的prototype与继承

yizhihongxing

JavaScript的原型(prototype)是一种机制,它允许对象继承另一个对象的属性和方法。在这种机制下,对象可以通过其原型链访问到其他对象的属性和方法。在本篇文章中,我们将探讨 JavaScript 中的 prototype 和继承。

原型(prototype)

每个Javascript对象(除了null和undefined)都有一个内部的属性[[Prototype]](也称为 .__proto__),它继承于该对象的原型对象(prototype object)。我们可以通过Object.getPrototypeOf()方法或通过. __proto__操作符获取一个对象的原型。

1.如何给对象添加原型属性

当我们创建一个新对象时,会自动创建一个原型对象,这个原型对象包含了可继承的属性和方法。我们可以使用Object.create()方法来创建一个新对象并将其原型设置为另一个对象的原型对象。

const person = {
  name: '张三',
  age: 18
};

const student = Object.create(person);
student.grade = '大一';
console.log(student.name); // 张三
console.log(student.age); // 18
console.log(student.grade); // 大一

2.如何给构造函数添加原型属性

每个 JavaScript 函数都有一个prototype属性,它指向该函数的原型对象。当我们通过 new 操作符创建一个实例时,JavaScript 将使用构造函数的原型对象创建实例对象。通过构造函数原型对象添加属性,可以实现该构造函数的所有实例的公共属性和方法。

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

Person.prototype.printName = function() {
  console.log(`我的名字是${this.name}`);
}

Person.prototype.printAge = function() {
  console.log(`我今年${this.age}岁了`);
}

const tom = new Person('Tom', 21);
tom.printName(); // 我的名字是Tom
tom.printAge(); // 我今年21岁了

继承

使用原型来继承属性和方法的对象叫做原型继承。JavaScript 中的继承基于原型链,只要我们在原型链上定义属性和方法,就可以实现继承。

3.如何实现原型继承

我们已经知道了如何在原型上定义属性和方法并访问它们,接下来我们将看看如何使用这个特性来实现原型继承。

const animal = {
  species: 'animal',
  makeSound() {
    console.log('Make Sound');
  }
}

const cat = Object.create(animal);
cat.name = 'Tom';
cat.species = 'cat';

cat.makeSound(); // Make Sound
console.log(cat.name); // Tom
console.log(cat.species); // cat

以上代码可以创建一个 cat 对象,该对象继承自 animal 原型对象。当我们调用 cat 对象的 makeSound() 方法时,它将在 animal 对象的原型对象中查找该方法并执行它。

4.如何实现构造函数继承

构造函数继承是使用父构造函数将属性和方法赋予给子构造函数的一种继承方式。子类使用父类的构造函数来创建自己的实例,并且在实例化的过程中,子类的所有属性和方法都将从父类继承。

function Animal(name) {
  this.name = name;
  this.makeSound = function() {
    console.log('Make Sound');
  }
}

function Cat(name) {
  Animal.call(this, name);
}

const tom = new Cat('Tom');
console.log(tom.name); // Tom
tom.makeSound(); // Make Sound

以上代码实现了一个名为 Cat 的构造函数,并继承了 Animal 的属性和方法。可以看到,在子类 Cat 中没有定义任何属性或方法,而 Cat 对象使用了父类Animal的构造函数来创建实例,并继承了 makeSound() 和 name 属性。

5.如何实现通过构造函数和原型的方式继承

JavaScript 中的继承通常使用原型链和构造函数技术来实现。下面,我们将展示使用构造函数和原型继承方式进行对象创建和继承。

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

Animal.prototype.makeSound = function() {
  console.log('Make Sound');
}

function Cat(name) {
  Animal.call(this, name);
}

Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;

const tom = new Cat('Tom');
console.log(tom.name); // Tom
tom.makeSound(); // Make Sound

以上代码通过 Animal 原型对象实现了 name 和 makeSound() 的属性和方法定义,之后我们通过 Cat 的构造函数继承了父类 Animal 的属性和方法。同时,我们将 Cat 对象的原型设置为 Animal 对象的原型,并且在子类 Cat 的原型对象中定义了自己的方法和属性,如上述示例中,tom对象的name和makeSound方法及属性均是通过通过构造函数和原型的方式实现的。

综上所述,我们已经学习了 JavaScript 的 prototype 和继承机制,我们可以创建一个新的对象并将其原型设置为另一个对象的原型,同时,我们也可以使用构造函数和原型来继承父类的属性和方法。这将有助于我们构建功能更强大和复杂的应用程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Javascript中的prototype与继承 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 利用递增的数字返回循环渐变的颜色的js代码

    利用递增的数字返回循环渐变的颜色是一种非常常用的js代码技巧,在很多前端开发场景中,比如渐变背景色、动态颜色等都需要用到这种技巧。 以下是详细的攻略: 步骤一:编写颜色渐变函数 我们需要编写一个函数,接受一个数字参数,根据这个数字参数返回一个渐变的颜色值。下面是一段伪代码,可以帮助我们理解这个函数的基本思路: function gradientColor(i…

    JavaScript 2023年6月11日
    00
  • 小程序中实现excel数据的批量导入的示例代码

    下面是关于“小程序中实现excel数据的批量导入的示例代码”的完整攻略。 准备工作 在进行excel数据批量导入前,我们需要做一些准备工作:1. 准备一个excel文件,并将需要导入的数据按照一定的顺序保存在sheet表格中。比如我们要导入学生的姓名、年龄、班级等信息,则需将这些信息对应的字段分别保存在不同的列中;2. 借助开发者工具,在小程序中新建一个页面…

    JavaScript 2023年6月10日
    00
  • Python中还原JavaScript的escape函数编码后字符串的方法

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

    JavaScript 2023年5月19日
    00
  • JS正则表达式验证中文字符

    当我们在开发Web应用时,经常需要验证用户输入的数据是否符合规则。JS正则表达式可以轻松地完成数据验证的任务。其中,验证中文字符是很常见的需求之一。下面,我们来详细讲解JS正则表达式验证中文字符的完整攻略。 1. JS正则表达式的基础 JS正则表达式是用于匹配字符串中字符组成模式的表达式。它通过一系列特定的字符和符号定义匹配规则。下面是一些常用的JS正则表达…

    JavaScript 2023年5月19日
    00
  • javaScript合并对象的多种方式示例

    下面是“JavaScript合并对象的多种方式示例”的完整攻略。 为什么需要合并对象? 在JavaScript中,对象是一个非常常用的数据类型,我们经常需要将多个对象进行合并,以实现代码的复用和更好的管理。具体应用场景举例如下: 合并默认选项和用户自定义选项,以实现更好的用户体验。 合并多个配置文件,以实现更好的配置管理。 合并多个对象,以获得更好的计算结果…

    JavaScript 2023年5月27日
    00
  • js关于getImageData跨域问题的解决方法

    关于getImageData跨域问题的解决方法相信很多前端开发者都会遇到,在此我将提供两条解决方案供大家参考。 解决方案一:使用CORS解决跨域 CORS是跨域资源共享,它是HTML5加入的新特性,相比其他解决跨域问题的方式而言更为简单便捷,同样也能很好地解决getImageData的跨域问题。 具体的实现需要服务端配合,在服务端的响应头中设置Access-…

    JavaScript 2023年6月11日
    00
  • 如何在CocosCreator中做一个List

    现在我来为您详细讲解如何在CocosCreator中做一个List的完整攻略。 1、创建List节点 首先我们需要在CocosCreator中用节点编辑器来创建一个List节点。创建节点的方式可以在菜单栏中选择Creator > Create Node。然后输入节点的名称并点击确定,此时我们将会得到一个空的节点。 2、添加List组件 在这个空节点上添…

    JavaScript 2023年6月11日
    00
  • js中动态创建json,动态为json添加属性、属性值的实例

    让我们来详细讲解一下JS中动态创建JSON、动态为JSON添加属性、属性值的实例。 一、什么是JSON JSON,全称为JavaScript Object Notation,是一种结构化的数据格式。它以文本的形式表示数据,比XML更加轻量级,也更容易解析。JSON由键值对构成,键值对之间用逗号分隔,最外层使用花括号{}。 JSON的键必须是字符串类型,值可以…

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