【JS】JS世界

340 阅读4分钟
  • 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.prototype
  • Object是个函数,他的构造函数是Function。那么Object的原型,即Object.__proto__ ===Function.prototype
  • Array.prototype.toString是个函数,他的构造函数是Function。那么Array.prototype.toString的原型,即Array.prototype.toString.__proto__ ===Function.prototype