【自我解惑】Object.__proto__

Author Avatar
Klein 4月 10, 2019

在看判断数据类型的时候有这么一个方法:

1
Object.prototype.string.call(value)

即通过 Object.prototype.toString 方法返回对象的类型字符串,以此来判断一个值的类型。

然后我就很突发奇想,直接写 Object.toString 可以吗?虽然知道会不行,但至少还是想搞清楚为什么不行,也算是对我看了那么久的原型相关的知识进行复盘。

首先是验证:

1
Object.toString === Object.prototype.toString // false

果然不行。

为什么呢?

之所以会有这个错误,是因为我搞混了原型链的知识:

先看定义:

访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着proto这条链向上找,这就是原型链。

而我以为 Object.__proto__ 可以找到 Object.prototype

然而并不行:

1
Object.__proto__ === Object.prototype // false

那么,最关键的问题出现了:Object.__proto__ 指向哪里呢?

一开始我记错了,以为是 null

结果我又错了:

1
Object.__proto__ === null // false

Object.prototype.__proto__ 才是指向 null

这时候我猛然想起:

对象的 __proto__ 指向的是创建它的函数的 prototype

Object 不仅是对象,也是一个构造函数!

那既然是一个函数,那么他就肯定也是由 Function 创造的!

所以 Object.__proto_ 指向 Function.prototype !

1
Object.__proto__ === Function.prototype // true

如下图所示:

JavaScript原型图

参考

深入理解javascript原型和闭包(4)——隐式原型
深入理解javascript原型和闭包(6)——继承