学习记录之原型,原型链

news2025/1/22 23:39:46

构造函数创建对象

Person和普通函数没有区别,之所以是构造函数在于它是通过new关键字调用的,p就是通过构造函数Person创建的实列对象

	function Person(age, name) {
			this.age = age;
			this.name = name;
	}
	let p = new Person(18, '张三');

prototype

prototype n. 原型;雏形;最初形态
在JavaScript中,prototype属性是每个函数对象自带的一个属性,它是一个指针,在内存中保存的是这个对象的引用,指向一个对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。当通过构造函数创建一个新的对象时,新对象内部会有一个内部属性([[Prototype]]),[[Prototype]]被设置为构造函数的prototype属性所指向的对象,也就是说jsp.__proto__ === Person.prototype为true

构造函数与原型

当定义了一个函数并且打算用它作为构造函数来创建对象时,这个函数的prototype属性就变得很重要了,所有通过这个构造函数创建的对象都会共享prototype对象上的属性和方法
在构造函数的prototype属性上添加到属性和方法,所有由这个构造函数创建的对象实例都可以访问这些属性和方法

	function Person(age, name) {
			this.age = age;
			this.name = name;
	}
	Person.prototype.say = function(){
			console.log(`i am ${this.name},age: ${this.age}`)
	}
	let p = new Person(18, '张三');
	let p1 = new Person(34, '李四');
	console.log(p,p1)
	console.log(p.say === p1.say)//true

在这里插入图片描述

原型链

JavaScript使用原型链实现了继承,每个对象都有一个内部链接到它的原型对象,而原型对象本身也是一个对象 ,也有自己的原型,这种链式关系一直持续到一个原型为null的对象为止,这标志着原型链的终点

__proto__与[[prototype]]与prototype

__proto__:每个JavaScript对象都有的一个属性,它指向该对象的原型,它是一个访问器属性(getter/setter),它提供了对对象内部属性的访问,指向对象的原型
prototype:每个函数对象都有的属性,它指向一个对象,这个对象会被分配给所有通过这个函数创建的对象的__proto__
[[prototype]]:是每个对象内部的一个属性,指向该对象的原型

实例与原型

当在实例上寻找一个属性没找到时,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,直到顶层为null为止

	function Person(age, name) {
			this.age = age;
			this.name = name;
	}
	Person.prototype.say = function(){
			console.log(`i am ${this.name},age: ${this.age}`)
	}
	Person.prototype.a = 100
	let p = new Person(18, '张三');
	p.a = 'a property'
	console.log(p.a, 'first')
	delete p.a
	console.log(p.a,'second')

console.log(p.a, ‘first’)打印的a是字符串’a property’,因为这个属性存在于这个实例本身,console.log(p.a,‘second’)打印的a是100,因为上一句代码删除了实例的a属性,所以在这个实例本身是找不到的,所以会去这个实例的原型p.__proto__上找,找到了a属性,打印,如果没找到就到原型的原型上去找

原型的原型

打印的p.proto,可以看到对象的原型也是一个对象,既然是对象就可以通过new Object()的方式创建,其实原型对象就是通过Object构造函数生成的,而实例的__proto__指向构造函数的prototype

在这里插入图片描述

Object.getPrototypeOf()

返回指定对象的原型,所以就有

	function Person(age, name) {
			this.age = age;
			this.name = name;
	}
	Person.prototype.say = function(){
			console.log(`i am ${this.name},age: ${this.age}`)
	}
   Person.prototype.a = 100
   let p = new Person(18, '张三');
   console.log(Object.getPrototypeOf(p) == Person.prototype)

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

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

相关文章

go语言zero框架通过chromedp实现网页在线截图的设计与功能实现

在 GoZero 框架中实现网页在线截图的功能,可以通过集成 chromedp 库来控制 Chrome 浏览器进行截图。chromedp 是一个基于 Chrome DevTools 协议的 Go 包,可以用来在 Go 程序中模拟浏览器操作,如页面截图、DOM 操作、表单提交等。 下面是一个…

以 RFID 为钥,开启民兵装备管理的科技之门

民兵配备的武器及装备涵盖了各式武器、弹药及军事技术设备,其管理的优良直接决定了民兵的作战效能。鉴于民兵装备普遍面临老化、维护支援不充分等问题,迫切需要迅速建立完善的民兵装备管理新体系。这一转变将推动民兵装备由数量扩张转向质量提升&#xf…

电脑办公技巧之如何在 Word 文档中添加文字或图片水印

Microsoft Word是全球最广泛使用的文字处理软件之一,它为用户提供了丰富的编辑功能来美化和保护文档。其中,“水印”是一种特别有用的功能,它可以用于标识文档状态(如“草稿”或“机密”)、公司标志或是版权信息等。本…

llama-factory实战: 基于qwen2.5-7b 手把手实战 自定义数据集清洗 微调

基于qwen2.5 手把手实战 自定义数据集 微调(llama-factory) 准备工作1.数据集准备(例:民法典.txt)2.服务器准备(阿里云 DSW 白嫖)3.环境配置pip 升级模型下载微调助手 4.数据集处理脚本文件4.1文本分割(ber…

微透镜阵列精准全检,白光干涉3D自动量测方案提效70%

广泛应用的微透镜阵列 微透镜是一种常见的微光学元件,通过设计微透镜,可对入射光进行扩散、光束整形、光线均分、光学聚焦、集成成像等调制,进而实现许多传统光学元器件难以实现的特殊功能。 微透镜阵列(Microlens Array&#x…

详解单片机学的是什么?(电子硬件)

大家好,我是山羊君Goat。 单片机,对于每一个硬件行业的从业者或者在校电子类专业的学生,相信对于这个名词都不陌生,但是掌没掌握就另说了。 那单片机到底学的是什么呢? 其实单片机在生活中就非常常见,目前…

基于Docker的Spark分布式集群

目录 1. 说明 2. 服务器规划 3. 步骤 3.1 要点 3.2 配置文件 3.2 访问Spark Master 4. 使用测试 5. 参考 1. 说明 以docker容器方式实现apache spark计算集群,能灵活的增减配置与worker数目。 2. 服务器规划 服务器 (1master, 3workers) ip开放端口备注ce…

9. 神经网络(一.神经元模型)

首先,先看一个简化的生物神经元结构: 生物神经元有多种类型,内部也有复杂的结构,但是可以把单个神经元简化为3部分组成: 树突:一个神经元往往有多个树突,用于接收传入的信息。轴突:…

web-view环境下,H5页面打开其他小程序

在Web-view环境下,H5页面无法直接打开其他小程序。正确的实现方式是先从H5页面跳转回当前小程序,再由当前小程序跳转到目标小程序。具体实现方法如下: H5页面跳转回小程序时,调用wx.miniProgram.navigateTo()方法。 小程序跳转到…

数据恢复常用方法(三)如何辨别固态硬盘故障类型

数据恢复首先需要辨别固态硬盘故障类型,只有先确认故障类型,才能进行下一步动作 如下是一种常见的场景,固态硬盘无法识别,接入电源与数据线,电脑的磁盘管理不显示任何信息。 第一步:确认硬件状态&#xff…

Android Studio打包APK

1.导出APK安装包 如果是首次打包,Create new 单击蓝色对话框右边文件夹📂图标 ,选择密钥保存路径,然后在下方File name对话框中填写您想要名称,再点击OK回到密钥创建对话框。 在此对话框中填写密码(Passwo…

当使用 npm 时,出现 `certificate has expired` 错误通常意味着请求的证书已过期。

当使用 npm 时,出现 certificate has expired 错误通常意味着请求的证书已过期。这可能是由于以下几种情况: 网络代理问题:如果使用了网络代理,代理服务器的证书可能过期或配置有误。系统时间错误:系统时间不准确可能导…

AWS IAM用户启用MFA认证

1. 进入IAM界面,点击Add user 2. 创建用户 3. 添加用户权限,例如这里赋予power user权限 4. 用手机下载MFA软件,进入App Store搜索mfa即可得到Google Authenticator,点击安装 5. 用户创建后,进入点击用户名进入Securi…

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证8)

为进一步测试通过请求头传递token进行身份验证,在main.htm中增加layui的数据表格组件,并调用后台服务分页显示数据,后台分页查询数据接口如下所示(测试时,直接将数据写死到代码中,没有查询数据库&#xff0…

Python新春烟花

目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…

【leetcode 24】151.翻转字符串里的单词==❗没看懂❗==

思路: 一些同学会使用split库函数,分隔单词,然后定义一个新的string字符串,最后再把单词倒序相加,那么这道题题目就是一道水题了,失去了它的意义。 所以这里我还是提高一下本题的难度:不要使用辅…

STM32+W5500+以太网应用开发+003_TCP服务器添加OLED(u8g2)显示状态

STM32W5500以太网应用开发003_TCP服务器添加OLED(u8g2)显示状态 实验效果3-TCP服务器OLED1 拷贝显示驱动代码1.1 拷贝源代码1.2 将源代码添加到工程1.3 修改代码优化等级1.4 添加头文件路径1.5 修改STM32CubeMX工程 2 修改源代码2.1 添加头文件2.2 main函…

Oracle审计

审计是监控选定的用户数据库操作的过程 审计的目的: 调查可疑的数据库活动: 审计可以帮助检测和跟踪潜在的 security breaches、未授权的访问尝试或其他异常行为。通过分析审计日志,可以确定可疑活动的来源、时间、频率和影响。 收集特定数…

智能新浪潮:亚马逊云科技发布Amazon Nova模型

在2024亚马逊云科技re:Invent全球大会上,亚马逊云科技宣布推出新一代基础模型Amazon Nova,其隶属于Amazon Bedrock,这些模型精准切入不同领域,解锁多元业务可能,为人工智能领域带来革新。 带你认识一起了解Amazon Nova…

2025 OWASP十大智能合约漏洞

随着去中心化金融(DeFi)和区块链技术的不断发展,智能合约安全的重要性愈发凸显。在此背景下,开放网络应用安全项目(OWASP)发布了备受期待的《2025年智能合约十大漏洞》报告。 这份最新报告反映了不断演变的…