一、最重要的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会将f1 的原型__p设置为Function.prototype,也就是#208
JS 世界的构造顺序(续2)
- 自己定义构造函数
Person,函数里给this加属性 Person 自动创建prototype属性和对应的对象#502- 在
Person.prototype #502上面加属性 - 用
new Person()创建对象p new会将p的原型__p设为#502