- js规定用
__proto__储存原型的地址 - 用
protoytpe储存我要创建的东西的原型 - 记住一点,JS创建一个对象时,不会给这个对象名字的

JS世界的构造顺序
1、创建根对象#101
- 里面有些属性,比如toString,valueOf
- 根对象没有名字
- 原型规定为null,即
__proto__ : null
2、用根对象创建“函数的原型”#204
- 里面有些属性,比如call、apply
- 我是由根对象创造出来的,所以我的原型为根对象#101,即
__proto__ : #101
3、用根对象创建“数组的原型”#404
- 里面有些属性,比如push、pop
- 我是由根对象创造出来的,所以我的原型为根对象#101,即
__proto__ : #101
我们都给函数一个原型了。那总的有东西把函数创造出来吧,不然给函数一个原型干啥
4、创建爸爸构造函数Function #2111
- 我是个函数,所以我的原型为“函数的原型”,即
__proto__ : #204 - 我要创造函数,所以我要创造的东西的原型为“函数的原型”,即
prototype: #204 - 此时发现Function的
__ proto__和prototype都是#208
5、用Function创建Object构造函数#909
- 我是由Function创建出来的函数,所以我的原型为“函数的原型”,即
__proto__ : #204 - 我要创建的东西是个对象,所以我要创造的东西的原型为“根对象”,即
prototype: #101
6、用Function创建Array构造函数#1101
- 我是由Function创建出来的函数,所以我的原型为“函数的原型”,即
__proto__ : #204 - 我要创建的东西是个数组,所以我要创造的东西的原型为“数组的原型”,即
prototype: #404
7、用Object构造函数创建window对象
- 用window的'Object'属性保存一个对象的地址#909,这时这个对象才被叫做Object(构造函数)
- 用window的'Array'属性保存一个对象的地址#1101,这时这个对象才被叫做Array(构造函数)
- 用window的'Function'属性保存一个对象的地址#2111,这时这个对象才被叫做'Function(构造函数)
JS世界需要的东西都准备好了,我们可以用起来了
1、用new Object()创造一个新对象
- 因为我是由Object函数创造出来的一个对象,所以我的原型为“根对象”,即
__proto__: #101
2、用new Array()创造一个新数组
- 因为我是由Array函数创造出来的一个对象,所以我的原型为“数组的原型”,即
__proto__: #404
3、用new Function()创造一个普通函数
- 因为我是由Function函数创造出来的一个函数,所以我的原型为“函数的原型”,即
__proto__: #204
4.1 用new Function()创造一个构造函数Person
- 因为我是由Function函数创造出来的一个函数,所以我的原型为“函数的原型”,即
__proto__: #204 - 我自动创建个
prototype,里面保存一个对象的地址#502(这个对象也是自动创建的),这个对象将是我要创造的东西的原型
4.2 用new Person()创造一个新person对象
- 因为我是由Person函数创造出来的一个对象,所以我的原型为上面新创的那个对象,即
__proto__: #502
根据上面的流程,可以总结出三个规律(顺口溜)
1、JS公式:新生对象.__proto__ ===构造函数.prototype
.__proto__可以读为“的原型”
2、根公理:所有对象的原型都直接或者间接指向根对象
3、所有函数都是由爸爸构造函数Function构造的,任何函数.__proto__===Function.Prototype
使用顺口溜(顺口溜不代表原理,只是凑巧发现这个规律)
Object.prototype保存的是根对象的地址,所以他是根对象。而根对象的原型是null,即Object.prototype.__proto__(使用原理,没用顺口溜)Function.prototype是个对象,他的构造函数是Object。那么Function.prototype的原型,即Function.prototype.__proto__ === Object.prototype- 箭头函数是个函数,他的构造函数是Function。那么箭头函数的原型,即
箭头函数.__proto__ ===c.prototype Function是个函数,他的构造函数是Function。那么Function的原型,即Function.__proto__ ===Function.prototypeObject是个函数,他的构造函数是Function。那么Object的原型,即Object.__proto__ ===Function.prototypeArray.prototype.toString是个函数,他的构造函数是Function。那么Array.prototype.toString的原型,即Array.prototype.toString.__proto__ ===Function.prototype