某天突然想知道 Object 和 Function的关系,在网上找到了这张图,看完后思路清晰了很多,在那图的基础上,我加上了Number,Boolean,String等三个系统提供的类型构造器和Object Function的关系图如上。
他们中只有 Function的prototype和__proto__是相同的。
其他的构造器 不无都是 Function 构造出来的对象,也叫是Function的实例是因为Object,Number,Boolean,String 甚至自定义的Foo 的__proto__无不都指向
Function.prototype 也就是function Empty .
而Function同时也是自己的构造函数 Function.constructor === Function
所以,js的对象系统里,可以说 所有的构造函数都是由Function构造而来
函数里最特别的一个就是 Function.prototype 也就是 Empty
Function.prototype.hasOwnProperty("prototype") //false
typeof Function.prototype;//function
也就是说这是唯一一个没有Prototype的函数
它是所有构造函数作为对象存在的 原型 Object.__proto__ , Function.__proto__,Number.__proto__ 设置是所有自定义构造函数比如Foo的原型 Foo.__proto__
而Empty 虽然没有 prototype但是 作为一个对象依然还是有__proto__,也就是 Object.prototype了。于是这就吻合了那句定义。。 Object.prototype是js里所有对象原型链的顶端。。。。。(undefined除外)
最后有个特例,就是 那么undefined应该放在哪里呢,在这个js object 的关系视图里