JS中三个公理
- JS公式:对象.__proto__ === 其构造函数.prototype
- 根公理:Object.prototype是所有对象的(直接或间接)的原型。
- 函数公理:所有函数都是由Function()构造的。
几个误区
- “的原型”指的是“.__proto__”,因此不能说Object()的原型是Object.prototype。
- 直接原型和间接原型:
- 对于普通对象而言,Object.prototype是直接原型。
- 对于函数、数组对象而言,Object.prototype是间接原型。
- Function()只是构造出了
prototype:#202这个键值对,但并没有构造Object.prototype的对象。因此,根对象不是由Function()构造出来的。 - 对象里不会包含另一个对象,只会包含另一个对象的地址。
JS世界的构造顺序
- 在#101创建根对象{toString()...},目前根对象没有名字。
- 在#208创建函数原型{call(),apply()...},#208.__proto__为#101,目前函数原型没有名字。
- 在#404创建数组原型{push(),pop()...},#404.__proto__为#101,目前数组原型没有名字。
- 在#342创建Function(),Function().__proto__为#208。
- 用Function.prototype存储函数原型的地址,等于#208。
- 此时发现Function.__proto__===Function.prototype。
- 用Function()创建Object()。
- 用Object.prototype存储根对象的地址,等于#101。
- 用Function()创建Array()。
- 用Array.prototype存储数组原型的地址,等于#404。
- 创建window对象。
- 用window的Function、Object和Array属性为4、6、8中的函数命名。
- 注意
- 直到步骤9,都为JS世界。从步骤10开始,都是浏览器世界。
- 直到步骤11为止,Function()、Object()、Array()实际上都是没有名字的。
- JS创建一个对象时,不会给这个对象名字的。
声明对象
![[Pasted image 20220630171801.png]]
let obj = new Object()
- new会将obj.__proto__设置为Object.prototype。
let arr = new Array()
- new会将arr.__proto__设置为Array.prototype。
let fn = new Function()
- new会将fn.__proto__设置为Function.prototype。
- 对象的构造函数构造出了对象。函数的构造函数构造出了函数。数组的构造函数构造出了数组。