原型
公式
对象.__proto__===该对象的构造函数.prototype
根公理
Object.prototype
是所有对象的(直接或间接)原型。
函数公理
所有的函数都是由Function构造的。即:
任何一个函数.__proto__===Function.prototype
//这个任何函数包括Object/Array/Function
根据上述内容引出一些一些容易导致混乱的问题
Q:一个数组的原型是Array.prototype
,但上面说Object.prototype
是所有对象的原型,那为何Object.prototype
不是这个数组的原型呢?
A:原型是分为直接原型和间接原形的,对普通对象来说,Object.prototype
就是个直接原型,对于数组和函数来说,Object.prototype
是一个间接原型。
以这个数组为例,它的原型指向了Array.prototype
,而Array
又指向了Object.prototype
。
Q:你说Object.prototype
是所有对象的原型,但是Object
是由Function
构造出来的,所以说应该是Function
构造了Object.prototype
,为什么Function
不是万物的起源呢?
A:这涉及到一个对象和地址的区别,Object.prototype
的地址在Object
中,而Object.prototype
的地址对应的那个对象并不在Object
里。
所以说,Function
构造出的Object.prototype
实际是一个地址,一个存根对象的属性,而不是根对象本身。
这个可能会比较难以理解,不抓紧琢磨明白就会陷入鸡生蛋蛋生鸡的死循环之中,有空我再看一看内存图,做一下记录。