一、最重要的3条知识:
1.JS公式
对象.__proto__===其构造函数.prototype
(JS唯一公式,如果不会就套公式) 2.根公理Object.prototype
是所有对象的(直接或间接)原型(所谓公理就是规定好的) 3.函数公理- 所有函数都是由
Funcition
构造的 任何函数.__proto__===Funcition.prototyp
- 任意函数有Object/Array/Funciton
二、JS世界
JS 世界的构造顺序
1. 创建根对象 #101
- 里面有些属性,比如
toString
,valueOf
- 根对象没有名字
- 原型规定为
null
,即__proto__ : null
2. 根对象没有名字创建函数的原型 #208
- 里面有些属性,比如
call
、apply
- 我是由根对象创造出来的,所以我的原型为根对象
#101
,即__proto__ : #101
3. 创建数组的原型 #404
- 里面有些属性,比如
push
、pop
- 我是由根对象创造出来的,所以我的原型为根对象
#101
,即__proto__ : #101
4. 创建 Function #342,原型 __p 为 #208
- 用
Function.prototype
存储函数的原型,等于#208
- 此时发现
Function
的__proto__
和prototype
都是#208
5. 用 Function 创建 Object
- 用
Object.prototype
存储对象的原型,等于#101
6. 用 Function 创建 Array
- 用
Array.prototype
存储数组的原型,等于#404
7. 创建 window 对象
- 用
window
的'Object'
'Array'
属性将 5 和 6 中的函数命名 - 记住一点,JS 创建一个对象时,不会给这个对象名字的
JS 世界的构造顺序(续1)
- 用
new Object()
创建obj1
new
会将obj1
的原型__p
设置为Object.prototype
,也就是#101
- 用
new Array(
) 创建arr1
new
会将arr1
的原型__p
设置为Array.prototype
,也就是#404
- 用
new Function
创建f1
new
会将f
1 的原型__p
设置为Function.prototyp
e,也就是#208
JS 世界的构造顺序(续2)
- 自己定义构造函数
Person
,函数里给this
加属性 Perso
n 自动创建prototype
属性和对应的对象#502
- 在
Person.prototype #502
上面加属性 - 用
new Person()
创建对象p
new
会将p
的原型__p
设为#502