三大定律
-
js唯一公式
对象.__proto__ === 其构造函数.prototype -
根公理
Object.prototype 是所有对象的 (直接或间接) 原型 -
函数公理
- 所有的 函数 都是由 Function 构造的
-
任何函数.__proto__ === Function.prototype - 任何函数包括Object、Array、Function
误区三
XXX的原型 __proto__ ? prototype
- Object 的原型是 Object.prototype 错误
- Object 的原型是
Object.__proto__正确
分析
- 中文的原型无法区分 prototype、
__proto__ - 因此原型默认表示
__proto__,即 xxx 的原型等价于 xxx.__proto__ - 而
__proto__只是正好等于某个函数的 prototype
[1,2,3]的原型是 Array.prototype 居然不是 Object.prototype ?
分析
- 对象分为两种:普通对象(Object)、特殊对象(Array、Function)
- Object.prototype 是普通对象的 直接 原型
- Object.prototype 是特殊对象的 间接 原型
Object.prototype 不是根对象 ?
- 所有函数都是由 Function 构造的包括 Object,根对象不应该是 Function.prototype ? 错误
分析
- 所有函数的原型才是 Functio.prototype ,具体关系查看js世界图
构建js世界图
- js创建对象时不会给这个对象命名
- 首先从创建无名根对象即对象的原型开始
- 依此创建 函数、数组 的原型
- 创建无名Function
- Function.
__proto__=== Function.prototype (所有函数都是由Function构造的) - 由Function创建无名的Object、Array
- Object.prototype存储了 对象的原型
- Array.prototype存储了 数组的原型
- 当创建了 window 时,用 window 对象的属性给函数命名即可引用
- 原型的原型是根对象

完整图示
- 使用构造函数创建对象具体看这里哦
- 构造函数会预先存好对象的原型
