JavaScript原型链
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