当前位置: 首页 > ops >正文

JavaScript原型,原型链。

JavaScript是一种基于原型的语言,它的每个对象都拥有一个原型对象。当试图访问一个对象的属性时,不仅仅会在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型。依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。这些属性和方法就定义在Object的构造函数上的prototype属性上,并不是再实列对象的本身。

原型

函数可以有属性,每个函数都有一个特殊的属性prototype(原型)看下面的一个列子:

 function doSomething(){console.log('do something');}console.log(doSomething.prototype)

运行结果是:

可以看到这个原型对象本身也有一个constructor属性,它指向doSomething函数本身,这允许通过实例访问到其构造函数。此外,这个原型对象还继承自Object.prototype,这意味着它可以通过[[Prototype]]链访问到Object.prototype上的所有属性和方法,如hasOwnProperty, isPrototypeOf, toString等。

原型链

原型链是JavaScript中实现继承的一种机制。在JavaScript中,每个对象都有一个指向另一个对象的内部链接,这个被链接的对象称为原型(prototype),而这个链接则被称为对象的[[Prototype]]。当尝试访问一个对象的属性时,如果该对象本身不存在此属性,JavaScript引擎就会通过这个链接查找该属性,直至找到该属性或到达原型链的末端(即null)为止。这一系列通过[[Prototype]]链接起来的对象就构成了原型链。

下面的图解更利于理解

原型链的工作原理:

  1. 属性查找:当你尝试访问一个对象的属性时,JavaScript首先会在该对象自身查找。如果找不到,它会沿着原型链向上查找,直到找到该属性或者到达原型链的顶端(null)。

  2. 构造函数与原型:每个函数都有一个prototype属性,这个属性是一个对象,包含可以由所有实例共享的属性和方法。当你使用构造函数创建对象时,新对象的[[Prototype]]将指向构造函数的prototype属性。

  3. 继承:子对象可以通过设置其[[Prototype]]为另一个对象来实现对父对象的继承。这样,子对象就可以访问父对象的所有属性和方法,除非这些属性和方法被子对象自己覆盖。

function Person() {this.name='people';}Person.prototype.say=function(){console.log(this.name+'hello world');}function Man(){this.sex='man';}// 设置Man的原型为PersonMan.prototype=new Person();// 修改Man的构造函数Man.prototype.constructor=Man;const man=new Man();console.log(man.name);console.log(man.sex);man.say();// 查看原型链//打印 man 对象的直接原型,即 Man.prototype(这是一个通过 Person 构造函数创建的实例)。console.log(man.__proto__);console.log(Man.prototype)//打印 Man.prototype 的原型,也就是 Person.prototype。console.log(man.__proto__.__proto__);console.log(Person.prototype);//打印 Person.prototype 的原型,也就是 Object.prototype。console.log(man.__proto__.__proto__.__proto__);console.log(Object.prototype);//打印 Object.prototype 的原型,为 null。console.log(man.__proto__.__proto__.__proto__.__proto__);

在上面的列子中Man的原型指向了Person实列,这意味着Man不仅可以访问自己的属性和方法还可以通过原型链来访问Person的的属性和方法。

http://www.xdnf.cn/news/13768.html

相关文章:

  • Elasticsearch 的自动补全以及RestAPI的使用
  • Arduino入门教程:1-1、先跑起来(点亮LED打印Helloworld)
  • `setVisible(false)` 隐藏菜单不生效的分析思路
  • Java Solon v3.3.2 发布(可替换,美国博通公司的 Spring 方案)
  • 轻松聊测试报告
  • Vue3学习(6)-Vue3的生命周期和自定义hook
  • 浅谈软件开发工作流
  • 论文参考文献干干货
  • Null-text Inversion for Editing Real Images using Guided Diffusion Models
  • ChatGPT革命升级!o3-pro模型重磅发布:开启AI推理新纪元
  • 人工智能应用案例:如何处理数据、分析数据并训练模型迭代至满意程度
  • Conan 包管理工具介绍与使用
  • 下载量飙升153.6%,《Solvely》如何成为出海AI教育应用新晋“黑马“?
  • Windows下安装MySQL5.7安装过程
  • Verilog基础:$timeformat系统任务的使用
  • Linux服务器部署n8n实战教程
  • AWS-EFS
  • 智能安全带:建筑行业安全防护的新利器
  • 黑群晖NAS部署DeepSeek模型与内网穿透实现本地AI服务
  • Linux中升级或者切换python版本
  • 网络上搜集的IFC资源共享(含下载链接)
  • LLM基础7_用于文本分类的微调
  • Cesium1.95中加载模型过多导致内存溢出的解决方案
  • 用户态与内核态是什么?有什么作用?两者在什么时候切换?为什么要切换?
  • 知识变现新趋势:创客匠人解析创始人 IP 打造与行业破局之道
  • SmartGit(图形化GitGUI客户端) v24.1.3
  • Python实现web请求与访问
  • 选品融电商:全域代运营赋能,抖音小红书销量倍增的头部引擎
  • SGDvsAdamW 优化策略详细解释
  • mybatis foreach里用bind、foreach中使用bind的坑、foreach中动态生成表名