这样理解 JS 原型链,通透

2023-05-28 0 893

__ proto__

前段时间在看剖面4,蓝本链的确是绕但是的,本瓜以后始终指出,如果读懂这句话就能了:

两个第一类的隐式蓝本(__proto__)等同于内部结构那个第一类的缺省的隐式蓝本(prototype)

确实,大部份第一类都合乎这句神性,在控制面板列印一试便知:

const str = new String(“123”) str.__proto__ === String.prototype // true const arr = new Array([“123”]) arr.__proto__ === Array.prototype // true const obj = new Object() obj.__proto__ ===Object.prototype // true const bl = new Boolean(false) bl.__proto__ === Boolean.prototype // true …… const fn = function(){} fn.__proto__ === Function.prototype // true 拷贝标识符

尽管他们平时单厢像下列这样写为主,新闻稿形式不那样,但结论维持不变:

const str = 123 str.__proto__ === String.prototype // true const arr = [123] arr.__proto__ ===Array.prototype // true const obj = {} obj.__proto__ === Object.prototype // true const bl = false bl.__proto__ === Boolean.prototype // true …… const fn = new Function() fn.__proto__ === Function.prototype // true 拷贝标识符

顺着那个思路,那他们接着在缺省上,继续用 __proto__ 寻找,能得到:

String.__proto__=== Function.prototype// true Array.__proto__=== Function.prototype // true Boolean.__proto__=== Function.prototype // true Object.__proto__=== Function.prototype // true Function.__proto__=== Function.prototype // true 拷贝标识符

这些基本缺省(String、Array、Boolean、Object 等),都是用 Function 来内部结构生成的!!

还能用 __proto__ 继续向上找吗? 不能了,因为结论会是始终重复下面这一行标识符:

Function.__proto__ === Function.prototype 拷贝标识符

所以,不管你怎样通 __proto__ 隐式蓝本向上找,最终都只能找到 Function,而 Function 的隐式蓝本等同于它的隐式蓝本;

prototype.__ proto__

但是这与他们所知不符呀,不是万物皆第一类吗??

他们尝试再用 __proto__ 向前探一步,发现:

Function.__proto__.__proto__ ===Object.prototype // true Function.__proto__ === Function.prototype // true Function.prototype.__proto__ ===Object.prototype // true 拷贝标识符

Function 那个终极缺省,通过查找隐式蓝本的隐式蓝本,竟然等同于 Object 的隐式蓝本!

其实,其它内部结构函数也那样,都能找到 Object:

String.prototype.__proto__=== Object.prototype // true Array.prototype.__proto__=== Object.prototype // true Boolean.prototype.__proto__=== Object.prototype // true Object.prototype.__proto__===Object.prototype // true 拷贝标识符

大部份缺省的隐式蓝本的隐式蓝本 等同于 Object 的隐式蓝本!!

认知

为什么要这种设定呢??

为什么第一类只用 .__proto__ 向上查找,最终只能找到 Function?

为什么缺省用 .prototype.__proto__ 向上查找,能找到 Object ?

这种蓝本链查找不是有两套逻辑吗?

后来,本瓜歪认知:

【Function】就好像是创造万物的上帝,它创造了:各种各样的物质【第一类】,物质又分化为:人【字符串】、鱼【数组】、鸟【布尔】、兽【数值】、石头【Date】、花草【正则】等等分类;

这些不同种类的物质,再一代一代延续(繁衍)下去。。。。。。

能从它们的祖先那里继承而来,这一点没毛病,生物 DNA 遗传,龙生龙、凤生凤,老鼠儿子会打洞

let Mouse = function(){ this.makeAHole = true } let m1 = new Mouse() m1.makeAHole // truem1.__proto__.makeAHole === Mouse.prototype.makeAHole// true 拷贝标识符

或者还能从【物质】那个原始分类而来, 因为人鱼鸟兽、花草树木、石头都还是属于“物质”,比如都有碳元素,就像字符串、数组、布尔、数值都是属于“第一类”,都有 toString 方法;

Object.prototype.carbon = true let p1 = man p1.carbon // truep1.__proto__.__proto__.carbon ===Object.prototype.carbon// true 拷贝标识符

第一类 Object(物质)是由函数 Function(上帝)创造的,没毛病。

上帝(Function)也是一种物质(Object),一切都是物质(Object),物质(Object)起源于大爆炸,起源于空(null),也没毛病。

再来看这张经典的图:

这样理解 JS 原型链,通透

按照咱们“认知”也画两个:

这样理解 JS 原型链,通透

哈哈哈,害行,这次就先认知到这吧。

OK,以上便是本篇分享。 觉得不错点个赞吧,您的鼓励,我的动力,坚持原创质量好文~~ 欢迎评论留言 我是掘金安东尼,输出暴露输入,技术洞见生活。再会吧~~

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务