JavaScript原型、原型对象、原型链系列详解(一)

(一)、JavaScript原型

原型

JavaScript 是一门面向对象的编程语言,其中原型(prototype)是一个重要的概念,它提供了一种创建对象的方式,使对象可以共享属性和方法。在 JavaScript 中,每个对象都有一个原型,可以从原型中继承属性和方法。

原型的定义

JavaScript 的原型是一个对象,它包含了一些公共的属性和方法。当我们创建一个新的对象时,它会从它的构造函数的原型中继承这些属性和方法。JavaScript 的原型链是由每个对象的 [[Prototype]] 属性所连接的,这些属性指向它的原型对象。

我们可以通过给构造函数的 prototype 属性赋值来创建一个原型,也可以通过 Object.create() 方法创建一个原型对象。

// 创建原型的两种方式

// 方式一:通过构造函数的 prototype 属性创建
function Person() {}
Person.prototype.name = 'Tom';
Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}.`);
};

// 方式二:通过 Object.create() 方法创建
const cat = { breed: 'Persian' };
const kitten = Object.create(cat);
kitten.name = 'Whiskers';
kitten.meow = function() {
  console.log(`${this.name} says "Meow!"`);
};

在以上示例中,我们通过构造函数的 prototype 属性和 Object.create() 方法创建了两个不同的原型对象。其中,Person 构造函数的原型对象包含了 name 和 sayHello 属性和方法,而 cat 对象是一个普通对象,它的原型对象是 Object.prototype。

原型的原理

JavaScript 原型的原理是基于 JavaScript 的面向对象编程中的原型继承。在原型继承中,一个对象可以从另一个对象中继承属性和方法。当我们访问一个对象的属性或方法时,JavaScript 会先在该对象本身中查找,如果找不到,就会到该对象的原型对象中查找。如果还是找不到,就会到原型对象的原型对象中查找,一直到最顶层的 Object.prototype 对象为止。如果在查找过程中找到了对应的属性或方法,就会使用它。如果找不到,就会返回 undefined。

以下代码示例演示了原型继承的基本原理:

// 创建一个原型对象
const animal = {
  makeSound() {
    console.log('I am making a sound');
  }
};

// 创建一个子对象,继承自原型对象
const cat = Object.create(animal);
cat.makeSound(); // I am making a sound

// 在子对象上添加新的属性和方法
cat.name = 'Whiskers';
cat.meow = function() {
  console.log(`${this.name} says "Meow!"`);
};
cat.meow(); // Whiskers

在以上代码示例中,我们首先创建了一个原型对象 animal,它包含了一个 makeSound 方法。然后,我们使用 Object.create() 方法创建了一个新的对象 cat,它继承自 animal 原型对象,并且拥有了 makeSound 方法。最后,我们给 cat 对象添加了 name 属性和 meow 方法,它们只存在于 cat 对象本身中,而不是在 animal 原型对象中。

当我们调用 cat.makeSound() 方法时,JavaScript 首先在 cat 对象本身中查找,发现它没有 makeSound 方法,于是就去它的原型对象 animal 中查找。在 animal 原型对象中找到了 makeSound 方法,于是调用它并输出了字符串 "I am making a sound"。

当我们调用 cat.meow() 方法时,JavaScript 首先在 cat 对象本身中查找,发现它拥有 meow 方法,于是调用它并输出了字符串 "Whiskers says "Meow!""。

原型的规则

  1. 所有的对象都有一个原型对象(prototype)属性,指向它们的原型对象。

  2. 原型对象也是一个对象,因此也有自己的原型对象,即原型链的顶端是一个指向null的对象。

  3. 对象可以通过原型链访问到它们的原型对象上定义的属性和方法。

  4. 如果对象本身和原型对象都定义了同名的属性或方法,则对象本身的属性或方法优先级更高。

  5. 如果对象调用一个不存在于自身和原型对象中的属性或方法,则会沿着原型链向上查找,直到找到该属性或方法或者原型链的顶端为止。如果都找不到则返回undefined。

  6. 如果对象调用一个方法时,方法中的this关键字会指向该对象。

原型的应用

JavaScript 的原型机制在面向对象编程中发挥了重要的作用,它允许我们创建一个类或者对象的模板,然后通过继承来创建新的对象,从而大大减少了重复编写代码的工作量。

以下是一个使用原型继承的示例,它定义了一个 Animal 类和一个 Cat 类,其中 Cat 类继承自 Animal 类:

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

Animal.prototype.makeSound = function() {
  console.log('I am making a sound');
};

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

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

Cat.prototype.meow = function() {
  console.log(`${this.name} says "Meow!"`);
};

// 创建 Cat 对象
const whiskers = new Cat('Whiskers');
whiskers.makeSound(); // I am making a sound
whiskers.meow(); // Whiskers says "Meow!"

在以上示例中,我们定义了一个 Animal 类和一个 Cat 类。Animal 类包含了一个构造函数和一个 makeSound 方法,Cat 类继承自 Animal 类,并包含了一个 meow 方法。我们通过在 Cat.prototype 对象上调用 Object.create() 方法,将 Cat.prototype 对象的原型对象设置为 Animal.prototype,从而实现了 Cat 类的继承。最后,我们创建了一个 Cat 对象 whiskers,并调用了它的 makeSound 和 meow 方法。

共享资源关注公众号获取

alt

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/482174.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[医学分割大模型系列] (1) SAM 分割大模型解析

[医学大模型系列] [1] SAM 分割大模型解析 1. 特点2. 网络结构2.1 Image encoder2.2 Prompt encoder2.3 Mask decoder 3. 数据引擎4. 讨论 论文地址:Segment Anything 开源地址:https://github.com/facebookresearch/segment-anything demo地址&#x…

常见六大WEB安全问题

一、XSS跨站脚本攻击 1.Cross-Site Scripting(跨站脚本攻击)简称 XSS(因为缩写和 CSS重叠,所以只能叫 XSS),是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行…

如何在没有备份的情况下恢复 Android 上已删除的照片?

丢失 Android 设备上的珍贵照片可能是一场噩梦,尤其是在没有备份的情况下。无论是意外删除图像还是由于Android 崩溃而丢失图像,一想到它们可能会永远消失就令人沮丧。幸运的是,有多种方法可以在 Android 上恢复已删除的照片。 如何在没有备份…

声控小助手:文本语音呼唤技术的应用与实现

title: 声控小助手:文本语音呼唤技术的应用与实现 date: 2024/3/22 18:20:42 updated: 2024/3/22 18:20:42 tags: 文本语音呼唤技术原理Python实现优缺点分析应用场景未来展望人机交互 1. 引言 在当今数字化时代,文本语音呼唤技术正逐渐成为人们生活中…

内存卡的照片怎么突然就找不到了,内存卡照片突然找不到如何恢复

最近,我遇到了一个令人困惑的问题,就是我的内存卡中的照片突然间找不到了。作为一个热爱摄影的人,我经常使用内存卡来存储我的珍贵照片。然而,最近我发现,无论我如何搜索和浏览,这些照片似乎就像消失了一样。内存卡照片突然找不到如何恢复?虽然挺沮丧的,但幸好遇上了以…

arm 解决Rk1126 画框颜色变色问题(RGB转NV12)

在Rv1126上直接对Nv12图像进行绘制时,颜色是灰色。故将Nv12转BGR后绘制图像,绘制完成后转成Nv12,BGR的图像颜色是正常的,但是NV12的图像颜色未画全,如图: 1.排查发现是RGB转NV12的函数出现问题&#xff0c…

【JS】滑动验证实现

功能需求:(图片可根据自行更换) 1.、右侧标签的位置是随机生成,左侧标签和右侧标签的垂直位置是一致的, 2、通过滑动条控制左侧标签与右侧标签重叠(误差控制在2px)表示验证通过, …

安卓手机系统跳过app启动广告软件

跳过广告关于此应用声明: 应用利用了安卓系统的辅助功能API,可以读取您手机屏幕上显示的所有内容,并且可以以您的名义进行屏幕点击等操作。* 轻量无广告,不联网,也不需要任何权限;* 请务必在系统设置中开启…

链表oj测试题(上)

链表的申明: struct ListNode {int val;struct ListNode* next; }; 1.题1 删除指定元素 例如:链表1 2 6 3 4 5 6,然后选择删除元素6,返回的链表为1 2 3 4 5 。 代码演示: typedef struct ListNode ListNode;List…

Linux文件 profile、bashrc、bash_profile区别

Linux系统中,有三种文件 出现的非常频繁,那就是 profile、bash_profile、bashrc 文件。 1、profile 作用 profile,路径:/etc/profile,用于设置系统级的环境变量和启动程序,在这个文件下配置会对所有用户…

学习刷题-12

3.22 hw机试【双指针】 Leetcode674 最长连续递增序列 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。 双指针 一个慢指针一个快指针 慢指针记录递增子序列起点,快指针去寻找还在当前递增子序列的最后一…

C++例子

#include<iostream> using namespace std;//抽象类 //抽象cpu类 class CPU { public:virtual void calcuate()0; }; //抽象显卡类 class VideoCard { public:virtual void display()0; }; //抽象内存条类 class Memory { public:virtual void storage()0;};//电脑类 clas…

leetcode 150.逆波兰表达式求值

题目 思路 逆波兰表达式也是经典的栈的应用问题。 先说什么是逆波兰表达式&#xff08;也叫后缀表达式&#xff09; 我们习惯的是这样的表达式&#xff1a;1 2 / 3 ,这也叫中缀表达式。 但是对于计算机来说不好理解&#xff0c;当从左扫描到 2 的时候还需要再判断2后面是什…

损失函数篇 | YOLOv8更换损失函数之CIoU / DIoU / EIoU / GIoU / SIoU / WIoU

前言:Hello大家好,我是小哥谈。损失函数是机器学习中用来衡量模型预测值与真实值之间差异的函数。在训练模型时,我们希望通过不断调整模型参数,使得损失函数的值最小化,从而使得模型的预测值更加接近真实值。不同的损失函数适用于不同的问题,例如均方误差损失函数适用于回…

vue2从基础到高级学习笔记

在实际的工作中,我常使用vue的用法去实现效果,但是你要是问我为什么这样写,它的原理是啥就答不上来了。对vue的认知一直停留在表面,写这篇文章主要是为了理清并弄透彻vue的原理。 学习目标 1 学会一些基本用法的原理 2 弄懂vue核心设计原理 3 掌握vue高级api的用法 一 vue…

基于springboot+vue的小型诊疗预约平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

蓝桥杯-单片机基础8——上下位机的串口通信设置(附小蜜蜂课程代码)

蓝桥杯单片机组备赛指南请查看这篇文章&#xff1a;戳此跳转蓝桥杯备赛指南文章 本文章针对蓝桥杯-单片机组比赛开发板所写&#xff0c;代码可直接在比赛开发板上使用。 型号&#xff1a;国信天长4T开发板&#xff08;绿板&#xff09;&#xff0c;芯片&#xff1a;IAP15F2K6…

知识管理平台企业要怎么用?看完你就会了

在信息爆炸的现代社会&#xff0c;知识管理的重要性不言而喻。一个强大的知识管理平台&#xff0c;可以让团队分享和查找知识变得更容易&#xff0c;提升知识管理效率和整体工作效率。本文将引导你了解如何有效地利用知识管理平台。 1.确定目标和需求 在使用知识管理平台之前…

每日一题 --- 设计链表[力扣][Go]

设计链表 题目&#xff1a;707. 设计链表 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则…

使用ollama + webui 运行任意大模型

安装ollama https://hub.docker.com/r/ollama/ollama docker run -d -v ~/Documents/work/softs/docker/ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama验证安装 # 进入容器docker exec -it ollama bash # 运行大模型 ollama run llama2 # 发送请求&…