JavaScript原型链

90 阅读3分钟
  • 先创造,后有名

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