三分钟带你理解JS原型

JavaScript class本质:原型链、constructor与new操作符深度解析 JavaScript中的class并非传统面向对象的类,而是基于原型(prototypes)机制的语法糖。其核心原理在于构造函数(constructors)与原型链的协同工作:new操作符创建实例并绑定[[Prototype]],constructor方法定义初始化逻辑,而所有实例方法自动挂载至prototype对象。这种设计既保留了JavaScript动态、灵活的原型继承特性,又提升了代码可读性与工程协作效率。在实际开发中,理解这一机制对解决this绑定异常、继承链断裂、静态方法调用失败等高频问题至关重要 阅读详情

一. 理论基础

1. 普通对象和函数对象

JavaScript中,万物皆对象!但是对象也是有区别的,分为普通对象和函数对象。

function F(){}; //F:普通对象
var f = new Function(); //f: 函数对象
var o = new Object(); //o: 函数对象

Object、Function是js自带的函数对象。

2. 构造函数

与大部分面向对象的语言不同,JavaScript中并没有引入类(class)的概念,但JavaScript仍然大量使用了对象,为了保证对象之间的联系,JavaScript引入了原型与原型链的概念。
与Java不同,JavaScript的new操作符后面跟的并非类名而是函数名,JavaScript并非通过类而是直接通过构造函数来创建实例。

function Dog(name, color) {
    this.name = name
    this.color = color
    this.bark = () => {
        console.log('wangwang~')
    }
}

const dog1 = new Dog('dog1', 'black')
const dog2 = new Dog('dog2', 'white')

上述代码中,有两个实例被创建,它们有自己的属性,但bark方法是一样的,而通过构造函数创建实例的时候,每个实例都需要创建这个方法。为什么不把这个方法放到一个单独的位置,并让所有实例都可以访问到呢?

3. 构造函数和普通函数

构造函数和普通函数主要有以下区别:

  • 调用方式:
    (1)构造函数需要使用new运算符调用,如果没有参数,可以省略括号,比如new Object
    (2)普通函数的调用不需要new运算符,而且必须有括号

  • this指向
    (1)构造函数的this会指向创建的对象实例上
    (2)普通函数的this则指向函数的调用者

  • 命名方式
    (1)构造函数名称首字母要大写
    (2)普通函数首字母要小写,使用驼峰命名方式


这里就需要用到原型。

二. 原型

  • 每一个构造函数都有一个prototype属性,指向原型对象。当使用这个构造函数创建实例的时候,prototype属性指向的原型对象,就是实例的原型对象。
  • 原型对象默认拥有一个constructor属性,指向指向它的那个构造函数。
  • 每个对象都有一个隐藏属性obj._proto_,每个函数对象都有一个function.prototype,它们指向同一原型对象。
  • 原型对象就是用来存放实例中共有的属性。
  • 访问对象属性时,会先在对象自身属性内查找,若没有找到,则会跳转到对象的原型对象中查找。

那么上述代码就可以修改为

 function Dog(name, color) {
    this.name = name
    this.color = color
}

Dog.prototype.bark = () => {
    console.log('wangwang~')
}

接着就可以创建实例,并访问它的bark方法:

 const dog1 = new Dog('dog1', 'black')
dog1.bark()  //'wangwang~'

这个时候,我们还可以重写bark方法:

const dog2 = new Dog('dog2', 'white')
dog2.bark = () => {
    console.log('miaomiaomiao???')
}
dog1.bark()  //'wangwang~'
dog2.bark()  //'miaomiaomiao???'

由上可知,重写的bark方法是为自己添加了一个新的方法使原型中的bark方法被覆盖了,而并非直接修改原型中的方法。
要修改原型中的方法应该这样:

Dog.prototype.bark = () => {
    console.log('haha~')
}
dog1.bark()  //'haha~'
dog2.bark()  //'haha~'

三. 结语

如有遗漏,后面会继续总结。

参考
https://www.jianshu.com/p/dee9f8b14771
https://juejin.im/post/5a94c0de5188257a8929d837
https://www.cnblogs.com/shayueblog/p/5813230.html
http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html

用CodeBuddy CLI三分钟搭建Next.js工具站:从SVG转换到图片处理的完整案例 本文详细介绍了如何使用CodeBuddy CLI这一AI驱动开发工具,在短短三分钟内快速搭建一个功能完整的Next.js图片处理工具站。通过自然语言指令,开发者无需记忆复杂命令,即可自动化生成包含图片缩放、格式转换、SVG转PPT等模块化功能的现代化Web应用,并集成TypeScript、Tailwind CSS和Shadcn/ui,大幅提升前端开发效率。 阅读详情

相关推荐

单相PWM整流器搭建训练——(一)拓扑原理介绍

单相整流器是一种将交流电转换为直流电的设备,主要由变压器、整流元件和滤波电路组成。变压器将输入的交流电压转换为适合整流的较低电压,整流元件(如二极管)利用其单向导电性将交流电转换为脉动直流电,最后滤波电路去除脉动直流电中的纹波,输出较为平滑的直流电,从而实现交流到直流的转换,广泛应用于各类电源设备中。

DikouNass的博客 1587

原型链的继承都发生在构造函数上

原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有”prototype”属性,函数对象有”prototype”属性,原型对象有”constructor”属性。 一、初识原型 在JavaScript中,原型也是一个对象,通过原型可以实现对象的属性继承,JavaScript的对象中都包含了一个”[[Prototype]]”内部属性,这个属性所对应的就是该对象的原型。

前端菜鸟 441

rv1126 读取sensor输入,输出到屏幕显示【RK_MPI API接口】

rv1126 libdrm VO

学习记录 1万+

到底什么是JS原型

一、首先大家在对JS原型进行解释的时候,会涉及两个概念:构造函数、原型对象二、使用构造函数创建对象三、与原型有关的几个方法 到底什么是JS原型 转载自blog:到底什么是JS原型 话说在前头,去网上查询很多关于JS原型的解释的文章,其中有80%看了都会不知所云,大多数关于JS原型的解释的文章或者视频,都忽略了很多读者对一些专业名词、概念是不掌握的,或许你说的一句话,就可以绕晕读者,导致大家走了很多很多弯路。在这里先分享我查到的一篇关于JS原型的解释,是最通俗易懂的,地址。 一、首先大家在对JS原型进行解

米不开朗基罗的博客 4811

告别激活烦恼:Lattice Diamond 3.13 永久免费License申请与配置全攻略(Windows 64位)

本文详细介绍了Lattice Diamond 3.13永久免费License的申请与配置全流程,特别针对Windows 64位系统用户。从官网导航的隐藏路径到Host ID的获取方式,再到License文件的高级处理技巧和环境变量的深度配置,提供了全面的安装教程和疑难问题解决方案,帮助开发者彻底告别激活烦恼。

weixin_28736335的博客 425

从零到一:STM32CubeMX虚拟串口开发中的常见陷阱与优化策略

本文深入探讨了STM32CubeMX在USB虚拟串口开发中的常见问题与优化策略,涵盖数据流吞吐量瓶颈、实时性约束等核心挑战。通过实战案例和代码示例,详细解析了波特率同步异常、数据丢失等问题的解决方案,并提供了DMA配置和中断优先级调优的高级技巧,帮助开发者提升STM32虚拟串口的性能和可靠性。

weixin_29164185的博客 370

js中的原型

原型就是每个对象都拥有一个属性,被称为原型,原型指向的对象称为“原型对象”。原型分为“隐式原型”和“显示原型”。JavaScript中每一个对象都有一个特殊的内置属性,这个属性指向的对象称为隐式原型对象。早期ECMA规范没有规定如何去查看,但是大部分浏览器给对象提供了 属性,可以查看这个对象的原型对象(实际开发不要使用因为有部分游览器没有提供,兼容性有问题)。后期ECMA提供了 ,可以查看原型对象。原型对象就相当于是对象的父类,当我们获取对象没有的属性时,对象就会自动去原型对象中查找(沿着原型链查找)代码

m0_46217225的博客 2322

Ardupilot chibios IO固件,IO与FMU通信,固件下载(3)

目录 文章目录目录摘要 摘要 本节主要记录自己学习IO与FMU通信

陌城烟雨 2801

javascript之原型与原型链

借鉴原文原型与原型链 一、prototype 在javascript除外,每一个函数都有一个prototype属性,这个属性指向函数的原型 function Person(age) { this.age = age } Person.prototype.name = 'kavin' var person1 = new Person() var person2 = new Person() console.log(person1.name) //kavin console.log(per

zhao97的博客 1184

YOLO11改进 | 主干网络 | 添加Hyper-YOLO的MANet混合聚合网络

本文详细介绍了在YOLO11目标检测模型中替换C3k2模块为MANet的具体实现方法。文章首先讲解MANet模块的原理,然后分步骤指导如何在YOLO11中添加该模块,包括代码修改、文件配置和模型注册等关键环节。通过实验对比,改进后的YOLO11_MANet模型在保持8.8GFLOPs计算量的同时,参数数量达到3,820,272,网络层数增加到343层。文章还提供了完整的代码实现和网络结构图,并建议结合其他注意力机制或损失函数进一步提升检测效果。最后推荐了相关的深度学习专栏,包含更多YOLO系列改进方法。

kay_545 660

agent-browser 安装笔记(OpenClaw)

【代码】agent-browser 安装笔记(OpenClaw)

tiantiantbtb的博客 1241

JS 原型的含义和使用

定义:原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。 对定义的解释: 所有的function对象都有一个系统自带的prototype属性,翻译过来即“原型”。假设有这么一个构造函数function Person(){}, function对象Person的prototype属性(即原型)也是一个对象,存在Person.prototype = {},我们可以把Person.prototype理解为Perso.

qq_45560350的博客 1602

YOLOv11改进有效系列目录 - 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制 - 针对多尺度、小目标、遮挡、恶劣天气等问题

在一些特定情况下,目标检测任务由于多种因素的影响,变得更加复杂和困难。以下是几类常见的困难目标检测场景:1. 小目标检测定义:小目标检测是指当目标在图像中的占比非常小时,模型需要准确识别和定位这些目标。典型场景包括远程监控、卫星图像分析等。挑战1. 低分辨率:由于目标在图像中占据像素较少,细节缺失,特征提取难度增加。2. 特征不足:小目标缺乏明显的形状和纹理特征,容易被复杂背景淹没。3. 检测难度大:由于小目标与背景之间的对比度较低,误检的几率上升。4. 数据不平衡。

qq_64693987的博客 4万+

三分钟带你了解JS、原型、原型链

三分钟带你了解JS、原型、原型链

月影WEB的博客 427

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

三分钟带你看懂prototype原型——ES6进阶

三分钟带你看懂prototype原型——ES6进阶1. prototype 定义2. new 构造函数3. 存储4. prototype 作用 1. prototype 定义 在JS中的类的实现是基于Prototype的,基于原型的继承比基于类的继承在概念上更为简单:一个新对象可以继承一个旧对象的属性 2. new 构造函数 代码很短很简单,要看完嗷~ // 源于黑马视频教程 function Star(uname,age){ this,uname = uname; this.age =

qq_41297145的博客 815

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

三分钟快速理解什么是 JavaScript 的继承

其实JavaScript中的继承,就是指的是一种机制,它允许一个对象(子对象)获取另一个对象(父对象)的属性和方法。这样的话子对象可以重用父对象的代码,同时还可以添加自己的特定功能。JavaScript是使用原型继承的方式来实现对象之间的继承关系。

Itmastergo的博客 183

三分钟看完JavaScript原型与原型链

前戏 写的比较短了,三分钟看完应该是没问题(嗯。。)。 当然最好再花半小时思考理解一下。 正文 构造函数与原型 与大部分面向对象语言不同,JavaScript中并没有引入类(class)的概念,但JavaScript仍然大量地使用了对象,为了保证对象之间的联系,JavaScript引入了原型与原型链的概念。 在Java中,声明一个实例的写法是这样的: ClassName obj = new ...

weixin_33912453的博客 173

快马平台一键生成:用OpenSpec三分钟搭建可运行API原型

它的核心功能是,你只需要把写好的OpenSpec文档内容贴进去,或者用自然语言描述你的API想法,它就能利用内置的AI能力,理解你的意图,并自动生成对应框架(如Node.js的Express或Python的FastAPI)的、结构清晰、可直接运行的完整项目代码。对于我生成的这个持续提供HTTP服务的API项目,平台的一键部署能力更是锦上添花,这意味着我可以将这个原型直接部署到一个临时的在线地址,分享给同事或客户进行体验,完全省去了自己配置服务器和域名的麻烦。当然,这个原型是“可运行”的,但也是“基础”的。

ThunderstormLynx23的博客 233

一次搞懂原型、原型链及其继承

说到原型链,想到前几年刚学习的时候看到的图,相信大家不陌生,现在想起来,这图确实有点画蛇添足了

illusion_melody的博客 521

推荐几篇关于原型和原型链的文章【必看】

相关资料 三分钟看完JavaScript原型与原型链 JavaScript’s Pseudo Classical Inheritance diagram Javascript inheritance behind the scene proto, ‘prototype’ and prototype 我来重新学习 javascript 的面向对象(part 4) ...

闰土月下追猹 154

别再只把Cursor当代码编辑器了!它的Composer模式,是隐藏的原型设计神器

本文深入解析Cursor的Composer模式如何成为开发者的AI原型设计神器,实现代码生成与界面设计的无缝衔接。通过项目级上下文理解、结构化输出和高效提示词技巧,开发者能快速构建可运行的原型系统,显著提升工作效率。特别适合需要快速验证交互逻辑的前端开发场景。

weixin_30752699的博客 433

JavaScript笔试题

1.有关变量作用域的提升 (function(){ var x = y = 1; })(); alert(x); alert(y); 此处思考五分钟。。。。 答案: undefined 1 解析: var x = y = 1;等价于y = 1;var x = 1; 此时y为一个全局变量,函数外可以访问。x为一个局部变量,函数外不可以访问。 知识点: 有关变量作用域的...

Jane_96的博客 794

Website-downloader:三分钟搞定整站下载的Node.js神器

你是否曾遇到过这样的困扰?看到一个精美的网站设计,想要离线保存研究;发现一篇珍贵的教程,担心网站突然关闭;或是需要备份自己的博客内容,却不知道如何完整保存所有资源。传统的浏览器"另存为"功能只能保存单页,而手动下载图片、CSS、JavaScript文件更是繁琐至极。 现在,想象一下:只需输入一个网址,点击一个按钮,就能**一键下载整个网站的完整源码和所有资源文件**。这正是Website-dow

gitblog_00024的博客 108

从原型链污染到 XSS 攻击:ppfuzz 如何一键生成利用 Payload

原型链污染(Prototype Pollution)是前端安全领域最容易被忽视的漏洞之一,而 ppfuzz 是一款用 Rust 🦀 编写的**原型链污染扫描工具**,能以极快的速度扫描客户端原型链污染漏洞,并自动识别页面中可利用的 JavaScript 库(Gadget),**一键生成可直接验证的 XSS 利用 Payload**。无论你是安全测试新手,还是经验丰富的 Bug Bounty 赏金

gitblog_00695的博客 766

【CodeBuddy】三分钟开发一个实用小功能之:记忆翻牌配对游戏

我需要一个记忆翻牌游戏,包含计时器、步数统计、动态卡片生成、胜利弹窗…”当开发者将这些需求输入CodeBuddy时,就像在咖啡厅向一位全栈工程师描述构想。AI通过自然语言理解,瞬间规划出技术方案:用<div>构建卡片容器,通过CSS的transform实现3D翻转效果,借助grid布局响应式适配,最后用JavaScript管理游戏状态。整个过程如同思维导图在数字世界具象化,需求与技术实现之间架起无形桥梁。

zevjay的博客 1068

三分钟了解 JavaScript 在前端开发中的核心作用

JavaScript 是现代前端开发的核心技术,广泛应用于网页交互、动态内容生成、用户界面设计以及与后端通信等多个方面。通过与其他前端技术(如 HTML 和 CSS)的协同合作,JavaScript 实现了现代网页的复杂功能和交互效果。未来,随着技术的不断发展,JavaScript 将继续在前端开发中发挥重要作用,推动网页应用向更加高效、智能和友好的方向发展。本人是10年经验的前端开发和UI设计资深“双料”老司机,1500+项目交付经历,带您了解最新的观点、技术、干货,下方微信我可以和我进一步沟通。

2401_87844781的博客 1007
上一篇: 【JS基础】从零开始带你理解JavaScript闭包--我是如何彻底搞明白闭包的
下一篇: JavaScript的事件循环与宏微任务
Colin_Mindset
博客等级 码龄12年 159粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值