一文搞懂 js 原型和原型链

news2024/11/15 4:45:40

文章目录

  • 一、前言
  • 二、原型
    • 2.1 概念
    • 2.2 获取原型的方法
      • 2.2.1 __proto__获取方式
      • 2.2.2 通过构造函数prototype 属性获取
      • 2.2.2 ES6 class 通过Object.getPrototypeOf()获取类原型
    • 2.3 通过原型实现继承
    • 2.4 原型的作用
  • 三、 原型链
  • 四、ES6实现继承
  • 五、综述


一、前言

原型和原型链是JavaScript中与对象有关的重要概念,但是部分前端开发者却不太理解,也不清楚原型链有什么用处。其实,学过其他面对对象语言的同学应该了解,对象是由类生成的实例,类与类之间有继承的关系。在ES6之前,JavaScript中并没有class,实现类和继承的方法就是使用原型。在我个人看来,JS中类和原型链的设计和语法由于一些历史或包袱问题而不易用,也不易于理解。因此在ES6中推出了class相关的语法,和其他语言更接近,也更易用。
ES6 class类
ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。(ECMAScript6入门教程 阮一峰)
虽然有了class,但是原型链相关的内容我们依然要掌握。不仅是因为作为前端开发者,我们要深入理解语法。而且在查看源码,以及实现一些复杂的面对对象写法时,依然是有用的。因此在这篇文章中,我们一起搞懂JavaScript中的原型和原型链。

二、原型

2.1 概念

JS的任何一个对象都拥有一个“原型对象”,他可以使用自己原型对象上的所有属性与方法。

2.2 获取原型的方法

2.2.1 __proto__获取方式

注意__是两个下划线。

// 1. 利用__proto__来调用原型
let cat = {
    name : '伽罗'
}
// 现在通过 cat.__proto__.eat 为cat的原型添加了一个方法 eat 这个方法来输出吃饭
cat.__proto__.eat=function() {
    console.log('吃饭')
}
cat.eat()

2.2.2 通过构造函数prototype 属性获取

function Cat(name,age){
    this.name=name
    this.age=age
}       
let cat = new Cat('伽罗',2)            
Cat.prototype.eat=function(){
    console.log('吃饭')
}
cat.eat()

2.2.2 ES6 class 通过Object.getPrototypeOf()获取类原型


class MyClass {
  constructor() {
    // 构造函数代码
  }
  classMethod() {
    // 类方法
  }
}
const prototype = Object.getPrototypeOf(MyClass);
console.log(prototype); // 输出 MyClass 的原型对象

2.3 通过原型实现继承

现在有一个管理系统。分为管理员和普通用户,普通用户只能登录,而管理员不光能登录还能删除用户。
Admin 可以使用自己的原型全部的方法。如果让自己的原型称为User的一个实例。即=new User()。那就相当于Admin 可以通过原型使用User的全部属性与方法。就实现了继承的思想。
在这里插入图片描述

function User(username,password){
    this.username=username
    this.password=password
 
    this.login=function(){
        console.log('登录');
    }
}
function Admin(){
    this.deletePerson=function(){
        console.log('删除用户');
    }
}
// 实现继承
Admin.prototype = new User()
let admin=new Admin()
admin.login()

2.4 原型的作用

1、模拟继承
2、规范日期:通过下述代码可以获取到当前日期,显示为 Wed Jul 06 2022 13:20:28 GMT+0800 (GMT+08:00)。但是 我不想要这种格式输出显示,我想显示成‘年/月/日’的格式,那么如何修改。

let date = new Date()
console.log(date);
let date = new Date()
Date.prototype.format = function() {
    let year = this.getFullYear()
    // 月份输出从0 开始 所以加一
    let month = this.getMonth()+1
    let date =  this.getDate()
    return `${year}${month}${date}`
}
console.log(date.format());
// 输出 2024年8月29日

三、 原型链

定义:JavaScript 规定,所有对象都有自己的原型对象(prototype)。一方面,任何一个对象,都可以充当其他对象的原型;另一方面,由于原型对象也是对象,所以它也有自己的原型。因此,就会形成一个“原型链”(prototype chain):对象到原型,再到原型的原型……
在这里插入图片描述
最后一个原型:原型链的尽头就是object。
在这里插入图片描述
还是管理员的例子,现在admin想调用login()。但是User() 里面没有login() 那么就会顺着原型链,继续向上寻找,直到找到objec,如果存在login()则输出,如果没有则报错。

function User(username,password){
   this.username = username
   this.password = password

 // this.login=function(){
 //     console.log('登录');
 // }
}
function Admin(){
   this.deletePerson=function(){
       console.log('删除用户');
   }
}
// 对objcet 上原型添加登录方法。
Object.prototype.login = function(){
    console.log('Object上的登录');
}
User.prototype = new Object()
Admin.prototype = new User()
let admin=new Admin()
admin.login()

四、ES6实现继承

那么在ES6之前不可以使用类,而JS在ES6之后引入了类的概念,那么就可以直接使用继承的思维了。
上述关于管理与普通用户的例子就可以修改ES6之后的写法。

class User{
  constructor(username,password){
      this.username=username
      this.password=password
  }
  login(){
      console.log('登录');
  }
}
 
class Admin extends User{
  deletePerson(){
      console.log('删除用户');
  }
}
 
let admin = new Admin()
admin.login()

五、综述

总体看来,虽然使用原型链确实可以实现类和继承的等面对对象特性,但是相比于其他语言更晦涩且不容易理解。更推荐ES6 使用class类来实现继承。

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

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

相关文章

计算机网络面试真题总结(七)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 什么是对称加密、非对称加密? 对称加密是一种常用的加…

C语言 之 自定义类型:结构体、结构体内存对齐、修改默认对齐参数 详细说明 可以来看看哟

结构体类型的声明 结构体的声明 struct tag {member-list; //结构体中的成员,可以有多个 }variable-list; //这里是直接创建结构体的变量,但是不一定要在这里声明变量 //不能把后面这个 ; 省略了例如结构体用于描述一个学生: struct Stu…

MySQL内部临时表(Using temporary)案例详解及优化解决方法

目录 前言 一.场景案例 二、什么是内部临时表? 三、哪些场景会使用内部临时表? 四、内部临时表如何存储? 1)使用内存 2)先使用内存,再转化成磁盘文件 3)直接使用磁盘文件 五、如何优化…

Stable Diffusion绘画 | ControlNet应用-IP-Adapter:一致性角色就这么简单

IP-Adapter 更新了全新的模型—FaceID plus V2 版本,同时还支持 SDXL 模型。 FaceID plus V2 版本的优点: 解决任务一致性 一张图生成相似角色 其中,两个 Lora文件 放置在:SD安装目录\models\Lora 两个 bin文件 放置在&#x…

三、IIC 总线协议——1、IIC总线协议介绍

IIC总线协议介绍 1、IIC介绍: Inter Integrated Circuit,同步、串行、半双工通信总线。 2、IIC总线结构图 ① 由时钟线SCL和数据线SDA组成,并且都接上拉电阻,确保总线空闲状态为高电平。 ②总线支持多设备连接,允许…

SSM电动车智能充电桩管理系统 项目源码24481

摘 要 随着社会对环保和可持续发展的关注不断增加,电动车作为清洁能源交通工具受到了广泛关注和推广。然而,电动车充电设施的建设和管理面临着诸多挑战,如充电效率低下、管理繁琐等问题。为解决这些问题,本研究设计开发了一款电…

揭秘无线领夹麦克风五大行业隐秘:音质失真、隐私泄露需警惕!

​无线领夹麦克风是演讲、教学、直播等场合的得力助手,然而市场上品牌众多,产品质量参差不齐,安全隐患层出不穷。作为一名音频设备评测师,我近期入手了多款无线领夹麦克风进行测评,下面就来为大家揭秘无线领夹麦克风行…

Jupyter Notebook详细教程

1、Ipython介绍 介绍 科学计算标准工具集的组成部分 IPython是一个免费、开源的项目,支持Linux、Unix、Mac OS X和Windows平台,其官方网址:Jupyter and the future of IPython — IPython IPython中包括各种组件,其中的两个主要…

无盘设计及其在Allegro中的具体操作

无盘设计的好处有两点: 去掉焊环后,增加了孔与线或是其它孔的间距; 去掉焊环后,铜皮避让的面积更少了,增加了铺铜平面的完整性。 一、确定通孔/过孔焊盘支持去除焊环 只有在封装中勾选了Suppress unconnected internal pads; leg…

AI大模型,互联网的中年革命?人才抢夺白热化,平均工资水平惊呆了……

写在前面 在腾讯股东大会上,CEO马化腾深刻指出,人工智能(AI)并非仅仅是互联网领域十年一遇的机遇,而是一个具有深远影响的、堪比电力发明的工业革命级别的重大机遇。 本文将包括: 1- 行业概览 2- 大模型…

C++必修:bitset的用法与实现

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C学习 贝蒂的主页:Betty’s blog 1. 位图的引入 首先我们来看一道面试题: 给40亿个不重复的无符号整数…

乌龙?揭露2024国自然被刷真相!

8月24日,国自然正式放榜,并且申请项目批准资助通知、不予资助通知以及专家评审意见也已发送到各位申请人手里。 中了的人兴奋庆祝,没中的人气愤懊恼,一遍又一遍的看着评审意见,甚至会质疑一些评审的意见有些 “不合理…

The Power of Scale for Parameter-Efficient Prompt Tuning

系列论文研读目录 文章目录 系列论文研读目录论文题目含义Abstract1 Introduction2 Prompt Tuning5.6.7.8.9.10. 论文链接 论文题目含义 刻度在参数高效快速调优中的作用 Abstract In this work, we explore “prompt tuning,” a simple yet effective mechanism for lear…

(四)Kafka离线安装 - Kafka下载及安装

Kafka官方下载地址:Apache Kafka 这时候下载安装版本。 我这里的安装目录在 /usr/local/ cd /usr/local/# 创建目录 mkdir kafka cd kafka mkdir kafka_log 把下载的压缩包,放入到/usr/local/kafka/目录下,解压。 # 解压 tar -zxvf kafka…

PDF招生简章如何转二维码?

​随着科技的不断发展,招生报名方式也在不断创新。如今,许多学校和企业都采用PDF招生简章来宣传招生。然而,传统的纸质招生简章存在携带不便、易损坏等问题。为了解决这些问题,将PDF招生简章转换为二维码成为了一种趋势。那你知道…

Laravel邮件发送功能的实现的方法和技巧?

Laravel邮件发信功能如何配置?怎么使用Laravel发信? 在现代Web开发中,邮件发送功能是不可或缺的一部分。Laravel框架以其优雅的语法和强大的功能,成为了许多开发者的首选。AokSend将深入探讨如何在Laravel中实现邮件发送功能&…

让甲方看得见服务器资源降本增效-软件开发不仅考虑开发成本也要重视长期的运维成本

这几天有几个开发者朋友问,用Go语言开发后端真能降低服务器成本吗?本文想分享是低成本一种解决方案,我们不讨论谁是世界上最好的开发语言,所以开发者朋友看到对比语言就不要去挣个高低。GoFly社区今天给大家分享我们这几年用下来真…

餐饮点餐外卖到店小程序系统管理

餐饮业主要以到店就餐和外卖方式/部分细分业快递配送、团餐等满足客户购餐消费需要,互联网时代,尤其是年轻人无论进店与否都追求快捷方便,商家也要提高自身服务效率。 制作餐饮外卖配送/到店/扫码点餐小程序并可在后台开启设置扫码点餐、到店…

黑神话悟空 PC端配置需求详解:如何为不同游戏体验选择合适的配置?

《黑神话:悟空》是一款备受期待的动作角色扮演游戏,由游戏科学(Game Science)开发,基于《西游记》改编。随着游戏的发布,许多玩家都在关心一件事:我的电脑能带动这款游戏吗?本文将详…

七年老玩家《王者荣耀》分析四:【更新与维护以及防沉迷系统】

目录 更新与维护 王者荣耀日常例行不停机维护的具体时间和内容是什么? 王者荣耀停机维护的历史案例及其对玩家体验的影响如何? 王者荣耀版本更新维护中,T0级英雄调整的标准和流程是什么? 王者荣耀大版本更新的准备工作包括哪些…