【自我解惑】Object.__proto__
在看判断数据类型的时候有这么一个方法:
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 |
如下图所示: