一、三大知识
- JS公式:
对象.__proto__===其构造函数.prototype - 根公理:Object.prototype是所有对象的(直接或间接)原型
- 函数公理:所有函数都是由Function构造的,即
任何函数(Object、Array、Function).__proto__===Function.prototype
二、以上三点+基础知识,即可推出JS世界
1、理清思路
- XXX的原型
- 【的原型】等价于【
.__proto__】
- 矛盾?直接原型和间接原型
- [1,2,3]的原型是Array.prototype
- 而所有对象的原型是Object.prototype
- 所以,对普通对象来说,Object.prototype是直接原型;对数组、函数来说,Object.prototype是间接原型
- 不认同根公理?
2、JS世界的构造顺序
- 创建根对象#101,无名
- 创建函数的原型#208,原型
.__proto__为#101 - 创建数组的原型#404,原型
.__proto__为#101 - 创建Function#342,原型
.__proto__为#208 - 让Function.prototype等于#208,有名
Function.__proto__===Function.prototype- 用Function创建Object#909,无名
- 让Object.prototype等于#101,有名
- 用Function创建Array#1101,无名
- 让Array.prototype等于#404,有名
- 创建window对象(不属于JS世界)
- 用window的'Object''Array'属性将7.和9.中的函数命名
- 记住一点,JS创建一个对象时,不会给这个对象名字的
(截图来自饥人谷课件)
- 这下,再new一个新的
- new Object()创建obj1,new会将obj1的原型
.__proto__设置为Object.prototype,#101 - new Array()创建arr1,new会将arr1的原型
.__proto__设置为Array.prototype,#404 - new Function创建f1,new会将f1的原型
.__proto__设置为Function.prototype,#208
- 自定义构造函数
- 自定义构造函数Person,函数里给this加属性(name、age等)
- Person自动创建prototype属性和对应的对象#502
- 可以在#502上加共有属性(国籍等)
- new Person()创建p,new会将p的原型
.__proto__设置为Person.prototype,#502
- 总结
- 一些刁钻等式