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

快速理解js原型链

javascript是一种动态类型,其使用原型链的方式实现继承关系。

对象[[Prototype]](__proto__) 属性

[[Prototype]]属性在很多Js之中实现为__proto__属性 ,这个属性的作用是:构成一个链条,查找值时,沿着链条向上找,找到了则返回对应的值,如果找到[[Prototype]]值为None,则返回undifined

我们看下面的一个例子

constdemo1={a:1,b:2,__proto__:{c:3,__proto__:{d:4}}}

运行结果是

这里查找demo某一个属性的链条是demo1->demo1.[[Prototype]]->demo1.[[Prototype]].[[Prototype]]->Object.[[Prototype]]->None,找到即停,这就是属性遮蔽的原因。

函数Prototype属性

js之中函数是一等公民,当函数作为构造函数时,构造的对象会继承该函数的Prototype内的属性和方法
下面是一个例子

constdemo1={a:1,b:2,__proto__:{c:3,__proto__:{d:4}}}functiondemo2(value:number):void{this.value=value;}demo2.prototype=demo1;letDemo2=newdemo2(100);console.log(Demo2.value);console.log(Demo2.c);

debug的结果是Demo2通过demo2.prototype = demo1;这个方式继承了demo1的属性

类的实质

既然我们每一次都写函数.prototype=...形成继承关系,太麻烦了,这个时候类这个语法糖就出现了

classLayerD{d:number=4;}classLayerCextendsLayerD{c:number=3;}classDemo1LikeextendsLayerC{a:number=1;b:number=2;}classdemo3extendsDemo1Like{value:number;constructor(value:number){super();this.value=value;}}letDemo3=newdemo3(100);console.log(Demo3.value);// 100(自身)console.log(Demo3.a);// 1console.log(Demo3.c);// 3console.log(Demo3.d);// 4

注意,这里仍然实现了原型链
demo3.prototype → Demo1Like.prototype → LayerC.prototype → LayerD.prototype → Object.prototype
实现效果和我们的第二节的例子代码一样,但是需要额外注意的是,内存结构中存在一些不同

注意看 此处Demo3之中的a,b,c,d属性都是在Demo3实例对象上,如果说存在很多个实例化对象,那么内存压力会有一些大,而采用第二节的对象[[Prototype]](__proto__) 写法,则会内存压力小很多。

当然,你也可以使用另一种更符合第二节的代码的原型继承方式即

classdemo3{value:number;constructor(value:number){this.value=value;}}demo3.prototype={a:1,b:2,__proto__:{c:3,__proto__:{d:4,},},};

总结

其实区分对象的[[Prototype]](__proto__) 属性以及函数的prototype属性,就能理解这个是两套平行的班子。
对象的[[Prototype]](__proto__) 属性目的是为了自身提供继承值
而函数的prototype属性则是为了产生实例对象提供继承值
类则是简化了这种继承关系的表达。

参考

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain

http://www.jsqmd.com/news/1217825/

相关文章:

  • HX4004A-MFC开关电容升压芯片:锂电池至5V转换实战指南
  • 程序员不会消失,但“只会写代码”的程序员会消失
  • 2026年最新教程:几张图片怎么竖着拼在一起 亲测免安装的实用方法 - 玩机日常
  • Unity游戏无声问题排查:从AudioSource到AudioListener的完整解决方案
  • IPXWrapper:让经典游戏在现代Windows上重获网络对战能力的终极指南
  • Android地图定位功能实现与优化指南
  • Windows C++ DLL开发:__declspec(dllexport)原理、用法与跨模块编程实践
  • Android日志封装实践:从基础到高级优化
  • MT5与Python集成:金融数据分析与量化交易实战指南
  • 2026年南康实木套系家具源头工厂哪家可靠,榫卯结构新中式家具/新中式家具/全屋定制家具,实木套系家具品牌厂哪家强 - 品牌推荐师
  • Visual C++构建高性能GIS系统:MFC架构与实战优化指南
  • 论文既要降重又要降AI怎么办?一次两项检测都降到合格
  • Lua与C/C++集成实战:性能优化与混合编程架构设计
  • 策略条件经常修改,选量化软件要看版本对照和回滚能力
  • AM62L CBASS防火墙配置实战:硬件级安全隔离与权限管理详解
  • C++20功能测试宏:跨编译器兼容性与条件编译实战指南
  • Spring MVC 4.0 JSON处理全解析与实战
  • BiliDownload实战攻略:Android平台最强B站视频下载与格式转换工具深度解析
  • ESP32-S3移植NumWorks计算器系统实战
  • CUDA编程指南:从核心概念到性能优化实践
  • 期末作业(1)
  • 声音特征辅助新冠初筛:可量化的呼吸道感染声学诊断方法
  • Flutter Widget基础:构建跨平台UI的核心元素
  • 家长必存!AI辅导与传统辅导成本效益对比清单:1对1名师年均6.8万 vs 智能系统年均4200元,但提分率反超23.6%?
  • 美的0涂层电压力锅技术解析:精钢厚釜如何实现健康烹饪
  • C++异常处理:从RAII到noexcept,构建健壮程序的完整指南
  • 本地部署开源工具 noveske_llc Ghetto Blaster 全流程部署指南
  • 网易我的世界三角洲山头服TTK测试:新赛季机制与战术全解析
  • 工业级算法思维:从复杂度分析到真实场景选型
  • Python控制流语句实战:购物车系统开发指南