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

news2024/12/22 16:58:12

(一)、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 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ruoyi-nbcio-plus基于vue3的flowable增加开始节点的表单绑定修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

在Linux上运行JMeter(非界面)

参考: 查看文件类型:https://www.linuxprobe.com/files-tehre-fangfa.html 华为云平台 配置:jdk环境、jmeter环境 jmeter配置(在/etc/profile文件中): export JMETER_HOME/path/to/jmeter/installati…

基于FPGA的FFT图像滤波设计

1.FFT滤波算法介绍 FFT滤波就是通过傅里叶运算将图像转换到频域空间,然后在频域中对图像进行处理,最后将处理后的图像通过傅里叶逆运算将图像转会到时域空间。 在频域空间中,我们能够更好的对图像的噪声进行分析,然后找出相关规律…

Selenium不同版本配置自动下载驱动及打包细节

Selenium配置浏览器驱动 自动下载浏览器驱动的方法 selenium4.7.0自动下载浏览器驱动的方法 selenium4.11.0 或4.11.1手动设置浏览器驱动路径的方法pyinstaller打包程序时同时打包ChromeDriverchromedriver路径需要sys._MEIPASS的路径进行引用方法一:通过–add-data…

Ubuntu18.04显示--有线连接未托管

引用: Ubuntu18.04连不网 报"有线连接未托管"_ubuntu20.04以太网未托管-CSDN博客 正文 虚拟机环境配置: VirtaualBox Ubuntu18.04桌面版 问题现象: Ubuntu18.04虚拟机的桌面上提示“有线连接未托管”,虚拟机不能上网&#xf…

云手机在运营社媒方面对比真机有何优势

云手机作为一种虚拟手机环境,通过云端技术实现了将多个手机系统运行在同一台设备上的功能。在运营社交媒体方面,与传统的真机相比,云手机 具有一系列独特的优势,本文将从多个方面进行对比分析。 1、安全性 云手机提供了更高级别的…

一个不会绘画的我遇到AI绘画的时代

AI 绘画的时代 我是没有艺术细胞的,这点我从很小就切实的感受到了,我不会画画,不会唱歌,我便是艺术的荒漠。童年是那么的梦幻,那么的值得渴望,谁不想亲自用自己的画笔来描绘记忆中的过去那?没错…

手机网页视频批量提取工具可导出视频分享链接|爬虫采集下载软件

解放你的抖音视频管理——全新抖音批量下载工具震撼上线! 在这个信息爆炸的时代,如何高效地获取、管理和分享视频内容成为了许多用户的迫切需求。为了解决这一难题,我们研发了全新的视频批量下载工具,让你轻松畅享海量音视频资源。…

PAT题解 --- 寻宝图

今天是PTA题库解法讲解的第十天,今天我们要讲解浪漫侧影,题目如下: 题解思路: 要解决这个问题,可以使用深度优先搜索(DFS)方法来遍历每一个陆地或宝藏格子,标记所有与之相连的格子…

数据降维 | Matlab实现POD本征正交分解数据降维模型

数据降维 | Matlab实现POD本征正交分解数据降维模型 目录 数据降维 | Matlab实现POD本征正交分解数据降维模型基本介绍模型描述程序设计基本介绍 1.Matlab实现POD本征正交分解数据降维模型(完整源码和数据); 2.运行环境matlab2023; 3.POD降维,POD分解(Proper Orthogonal D…

计算机二级Python基础操作题

题目来源:计算机二级Python半个月抱佛脚大法(内呈上真题版) - 知乎 第4,5,6,7,9,10,11套 1. 基础题1 sinput() print("{:\"^30x}".format(eval(s))) b …

数据库被.[Goodmorningfriends@onionmail.org].faust勒索病毒加密,能恢复吗?

.faust勒索病毒有什么特点及危害? .faust勒索病毒是一种恶意软件,以其复杂的加密技术和勒索行为而闻名。这种病毒的主要目标是通过加密受害者的数据文件,然后勒索赎金以解密这些文件。它通常通过恶意附件、恶意链接或潜在的不安全下载源传播&…

云平台宿主机系统漂移分析

ntp时间同步机制 宿主机上ntp client每隔最小时间间隔64s,最大时间间隔1024s与ntpd server保持时间同步,当ntp client 与ntd server时间偏差为|+-10|s,立马纠正client ntp的时间与 ntp server保持一致。 宿主机时间异常判定 宿主机ntp client 并发去访问五个ntp servers…

letcode::根据二叉树创建字符串

根据二叉树创建字符串 题目描述: 给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。 空节点使用一对空括号对 “()” 表示,转化后需要省略所有不影…

【JavaEE初阶系列】——带你了解volatile关键字以及wait()和notify()两方法背后的原理

目录 🚩volatile关键字 🎈volatile 不保证原子性 🎈synchronized 也能保证内存可见性 🎈Volatile与Synchronized比较 🚩wait和notify 🎈wait()方法 💻wait(参数)方法 🎈noti…

【Python + Django】静态文件的添加

前言: 前一篇文章我们已经学会了怎么用django写文本页面啦!!! 有一说一,这个静态页面是真的丑。 我们总得用一些花花绿绿的东西把这个丑陋的网站给装饰一下吧!!!!&…

java中异常类

异常 异常体系继承结构 Throwable类是 Java 语言中所有错误或异常的超类,只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。     异常是对象,而对象都采用类来定义。异常的…

IDEA使用手册

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

真机笔记(1)第一阶段知识讲解

目录 第一阶段讲解: 1.1 机房 1.2 分类: 1.3 机房建设标准 1.3.1 安全性: 1.3.2 供电: 1.3.3 空气调节:(恒温恒湿) 1.3.4 电磁防护: 2.1 机柜 2.2 分类 2.3 机柜的高度单位 3.1 设备…

postman 用上一个请求的响应体中的字段设置下一个请求的请求参数

文章目录 IntroPostman usagePre-request ScriptTests javascripts API Intro 这一切都是为了增加自动化动作所占的比例(减少人手工操作复制粘贴可能会造成的错误)。 Postman usage 最常用的:选HTTP方法类型、写URL,在Headers中…