至简·原型与原型链

程序如同艺术 ,源于生活而又高于生活…
每位coder就像追寻真理的苦行僧,他们谱写着自己对于生活的理解。
并在程序的世界里,追寻真理,感悟真理。

《至简 · 一》原型-原型链

第一次接触编程是在大学,那时是从c语言开始的,当时对于程序没有那么多的理解,更多的是新鲜。之后也学习了OOP,还有数据结构,但是最终对c语言还是没能进行更多的探究。
而是选择了前端进行深入,我喜欢从事有关美的事物,所以在大学期间,多数也算是“不务正业”,当初爱上了游戏场景设计,地形编辑。它们不同于当初写的c程序,因为它们表现的更直观。之后也经历了种种,也学习了种种。最终走上了前端这条路我想还是因为美。现在依然记得在做ASP时,对于网页美感的苛求,我敢肯定在这个点上花费的时间严重多于对于后台Server的设计。

回归正题,来讲述今天的话题

  1. 万物皆对象 :这句话大概经常听到了,这句话是从程序的映射到现实的写照。但是却非最高境界,佛曰四大皆空。 神秀曰:身是菩提树,心如明镜台,时时勤拂拭,莫使惹尘埃。 慧能曰:菩提本无树,明镜亦非台,本来无一物,何处惹尘埃。
    javascript的世界中,对象就如同这佛法,源于一个null。

  2. 道生一,一生二,二生三,三生万物
    何谓道,这是个还要继续追寻的真理。目前还不明确
    还是说null吧,null就如同这个道,如同宇宙出生于混沌,null是什么,讲不清,道不明,null就是null,它既是无,又存在。

万物皆对象,其他的对象,通过构造函数创造,于是乎又诞生了Object和Function,他们彼此结合,提供了原型(prototype)和构造器(constructor),一个为子孙提供基因,一个负责制造万千子孙,如果说null是上帝,那么他们俩就如同亚当和夏娃。

  1. 什么是原型prototype
    什么是原型,通俗的讲,就是一个模子,要制作一件陶器,得先有个模子,照着这个模子,才能批量的生产,而prototype就是对象的模子,既然是模子,那么它也是存在的,它也是对象。构造函数,负责批量的生产。
    如何找到这个模子呢,在js中函数function存在一个属性,即prototype属性,可以通过函数来访问。记住,只有函数存在prototype属性,例如:
       function Person(){}
       var person = new Person();

在浏览器里观察
在这里插入图片描述
可以看到Person通过prototype属性找到它的原型对象即Person.prototype,原型有通过constructor指向Person。意思就如同Person说,我的原型是Person.prototype,而Person.prototype说Person是我的构造器。就像酱紫:
在这里插入图片描述
可是prototype是只有function才有的属性,我们如何对每个对象该如何追根溯源呢?难道他们是猴子吗,是从石头缝里蹦出来的吗?emmm…这是一个问题。

  1. 真正的基因__proto__
    每个对象都有着__proto__属性,它的作用是什么呢?就是告诉我们不要忘了自己的根儿…
    接着看刚才那副图片
    在这里插入图片描述
    看到了一个浅紫色的__proto__,这是什么呢,__proto__指向了Object这能说明什么呢?先不急。
    再来看看下一个
 function Person(){}
 var person = new Person();

举个栗子
我们通过构造函数Person实例化出一个新的小person,小person年少无知忘了自己亲爹是谁了,就问他面前的Person构造函数
说,“你是我爹吗?”
构造函数上去就是一嘴巴子,“完蛋玩意,我是你妈啊 ! 是我生的你啊,真完蛋!”。
小person明白了,哦 ,你是我妈,那我爹是谁啊?
他妈又是一嘴巴子说:你爹是Person.prototype!
谁知小person很气愤的说:“你说我爹是Person.prototype那就是吗?我不信! 万一不是呢…”。
只好拉着小person去做了基因检测,发现小person身上的基因__proto__的确是指向Person.prototype ,
在这里插入图片描述
至此,小person终于找到了自己的亲爹。
开个玩笑哈,方便去理解,这里的爹指的就是原型,就是那个模子。关系图如下。
在这里插入图片描述
对于__proto__属性,官方不建议使用,不建议对此属性进行操作,__proto__属于内部属性。若要检查对象的原型,可以通过

  • instanceof 运算符返回一个布尔值,表示一个对象是否由某个构造函数创建。
  • Object.isPrototypeOf()只要某个对象处在原型链上,也会返回一个bool值,若为true就说明对象是其原型。
  • 当然还有别的方法

借此,我们就可以顺着这个基因链顺藤摸瓜,找到每一个对象的祖先。再次说一下,__proto__是每个对象都有的属性,function也是对象,也不例外。来试一试吧,来看看大person的爹是谁,小person妈妈(构造函数)的爹又是谁。
在这里插入图片描述

上面可以看到构造函数Person的祖先,就是Function原型对象。
在这里插入图片描述
可以看到小person祖先是Person.prototype原型对象,Person.prototype原型的祖先是Object.prototype原型对象。
并且可以看到Function.prototype的祖先也是Object.protype原型对象。
在这里插入图片描述
也就是说Object.protype原型对象,是所有对象的的最祖先原型,即太太太太爷爷。

我们还可以继续追根溯源,看看他们的祖先,太太太太爷爷的爹到底是谁在这里插入图片描述
最终发现对象的祖先是来源于一个null,还当真映了佛门那句,四大皆空,amazing。

借此,以一幅图,来展示整个原型的关系结构:
在这里插入图片描述
看到这个是不是有些蒙蔽,这啥玩意指来指去的,什么鬼。好吧,我承认这个图是有些复杂了,但是绝对是我良心之作。

为了方便于理解,我又画了一个浓缩版的。
在这里插入图片描述
大图是重点,可以看出,像这种,一个原型对象,作为另一个实例的原型,而原型对象,又是另一个原型的实例,通过__proto__属性链接,最终形成的这种层层递进的链式结构,也就是原型链的原理。

emmmm…至此关于有关于原型的环节就说到这。
若有错误,望各位前辈指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com
原型原型链JavaScript 中的重要概念,用于实现对象的继承和属性访问。 在 JavaScript 中,每个对象都有一个隐式的属性__proto__,它指向该对象的原型prototype)。原型是一个普通的对象,它包含共享的属性和方法。当我们访问一个对象的属性时,如果该对象本身没有该属性,JavaScript 引擎会沿着原型链向上查找,直到找到该属性或到达原型链的末尾。 原型链就是这种沿着__proto__指针链进行属性查找的过程。一个对象的原型可以通过 Object.getPrototypeOf() 方法获取。 当我们创建一个新的对象时,可以使用构造函数或者字面量来创建。构造函数可以通过使用 new 关键字来创建新的对象,并且每个构造函数都有一个 prototype 属性,该属性指向新创建的对象的原型。字面量创建的对象的原型是 Object.prototype。 通过设置构造函数的 prototype 属性,我们可以实现对象之间的继承。子对象将继承父对象原型上的属性和方法。当我们访问子对象的属性时,如果子对象本身没有该属性,会沿着原型链向上查找。 需要注意的是,原型链是一个单向的链式结构,如果在原型链上层级相同的位置存在同名属性,那么只会返回第一个找到的属性值。 总结起来,原型原型链JavaScript 中实现对象继承和属性访问的重要机制,通过原型链,我们可以共享属性和方法,并且实现对象之间的继承关系。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值