JS难点总结
这里我们先总结一下3条公式,等下会一一解释
LAW(1)

LAW(2)

LAW(3)

接下来我们从0开始构建一个JS世界
(1)我们需要创建一个根对象,他是所有对象的祖先[#268]

(2)接下来创建的是函数的原型对象[#306]和数组的原型对象[#146]

(3)有了基本的原型对象以后,我们需要创建一个所有函数的构造者Function[#66]

这个函数的构造函数Function是以函数对象[#306]为原型创建的,所以,他的_proto_属性就是[#306]
当这个构造函数去创建另一个函数f1()的时候,他会把所创建的函数的原型也就是f1._proto_指向函数的原型[#306]
其实每个函数都拥有一个prototype属性,他的意思是我会把我创建的对象的原型指向哪,所以此时Function.prototype就等于函数的原型对象[#306]
这时候就得出了LAW(2),此时你会发现Function._proto_和Function.prototype的值是相等的

那么带入公式2,我们是不是就可以得出Function的构造者就是他自己呢,但是其实Function是一开始由JS构造的,他都不存在又如何能构造自己呢,只不过被构造出来之后,被赋予了使命去构造其他的所有函数,这就有了LAW(2),但是为了统一成LAW(3),就指定了Function的构造者就是他自己
(4)现在我们有了所有函数的构造函数Function,就可以去创建其他的函数了,比如构造对象的函数Object[#24]和构造数组的函数Array[#58]

由于他们都是由Function以函数的原型[#306](Function.prototype)构造出来的,所以他们的_proto_属性都是[#306],由于他们俩都是构造函数,是用来构建其他对象的函数
他们以对象的原型对象[#268]和数组的原型对象[#146]作为他们创建的子对象的原型,所以他们的Object.prototype属性和Array.prototype属性就存储着他们将要创建子对象的原型
自此我们基本上就把整个JS世界构建完成了
