一、理清一些概念
object与Object不一样。object是一种数据类型,是八大数据类型之一,数组、函数、日期、正则都是该数据类型的一种;Object是一种构造函数,由Function创建(同理,Array也是一种构造函数,由Function创建)。- 区分根对象和根对象的地址。根对象没有名字,但可以写为:
Object.prototype 对象;根对象地址可以写为:Object.prototype,该地址指向根对象。 window的'Object'、'Array'属性只是将构造函数Object和Array进行了命名。- “xxx 的原型” 可以理解为
xxx.__proto__。
二、理解 JavaScript 中的 prototype 和 __proto__
3 个重要知识点
- JS 公式:
对象.__proto__ === 其构造函数.prototype。 - 根公理:
Object.prototype是所有对象的(直接或间接)原型。 - 函数公理:所有函数都是由
Function构造。
JS 世界的构造顺序
- 创建根对象 #101(
toString),根对象没有名字。 - 创建函数的原型 #208(
call /apply),原型的__proto__为 #101。 - 创建数组的原型 #404(
push/pop),原型的__proto__为 #101。 - 创建
Function#342,原型的__proto__为 #208。 - 用
Function.prototype存储函数的原型,等于 #208。 - 此时发现
Function的__proto__和prototype都是 #208。 - 用
Function创建Object。 - 用
Object.prototype存储对象的原型,等于 #101。 - 用
Function创建Array。 - 用
Array.prototype存储数组的原型,等于 #404。 - 创建
window对象。 - 用
window的'Object' 'Array'属性将 7 和 9 中的函数命名。 - 记住一点,
JS创建一个对象时,不会给这个对象名字的。