第一个重要知识:JS公式
对象.__proto__ === 其构造函数.prototype
第二个重要知识: 根公理
Object.prototype是所有对象的(直接/间接)原型
第三个重要知识:函数公理
所有函数都是由Function构造的
任何函数.__proto__ ===Function.prototype
任何函数有Object/Array/Function
错误一
XXX的原型
- {name :'frank'} 的原型
- [1,2,3]的原型
- Object的原型
解读
- Object的原型是Object.__proto__ :对
- Object的原型是Object.prototype :错
错在哪
- 【的原型】 等价于【.__proto__】
- 中文的【原型】无法区分__proto__ 和 prototype
- 所以我们只能约定,原型默认表示__proto__
- 只不过__proto__正好等于某个函数的prototype
错误二
问题
- [1,2,3]的原型是Array.prototype
- 你又说Object.prototype是所有对象的原型
- 那为什么Object.prototype不是[1,2,3]的原型
错在哪
- 原型分两种:直接原型和间接原型
- 对于普通对象来说,Object.prototype是直接原型
- 对于数组,函数来说,Object.prototype是间接原型
错误三
Object.prototype不是根对象
理由
- Object.prototype是所有对象的原型
- Object是Function构造出来的
- 所以,Function构造了Object.prototype
- 推论,Function才是万物之源啊!
错在哪
- Object.prototype 和Object.prototype对象的区别
- 对象里面从来都不会包含另一个对象
JS世界的构造函数
- 1.创建根对象#101(toString),根对象没有名字
- 2.创建函数的原型#208(call/apply),原型__p为#101
- 3.创建数组的原型#404(push/pop),原型__p为#101
- 4.创建Function#342 ,原型__p为#208
- 5.用Function.prototype存储函数的原型,等于#208
- 6.此时发现Function的__proto__和prototpe都是#208
- 7.用Function创建Object
- 8.用Object.prototype存储对象的原型,等于#101
- 9.用Function创建Array
- 10用Array.prototype存储数组的原型,等于#404
- 11.创建window对象
- 12.用window的'Object ' 'Array' 属性将7和9中的函数命名
- 13.记住一点,JS创建一个对象时,不会给这个对象名字