JS三大定理
拨乱反正的三个问题
问题1
{name:frank} 的原型
[1,2,3] 的原型
Object 的原型
- 这里面
的原型
到底是什么?是._ _proto_ _
还是prototype
?
- 中文的「原型」无法区分
._ _proto_ _
和prototype
- 所以我们只能约定,原型默认表示
._ _proto_ _
- 只不过
._ _proto_ _
好等于某个函数的prototype
问题2
let arr = [1,2,3]
arr 的原型是 Array.prototype
- 定理中:
Object.prototype
是所有对象的原型,为什么arr的原型不是Object.prototype
而是Array.prototype
?
- 原型分两种:直接原型和间接原型
- 对于普通对象来说,
Object.prototype
是直接原型
- 对于数组、函数来说,
Object.prototype
是间接原型
问题3
Object.prototype是所有对象的原型
Object是Function构造出来的
所以, Function构造了Object.prototype
- 根据上面的描述:Function才是根对象啊?Object.prototype不是根对象?
- 从上图可知Function只是创造了
Object.prototype
这个存地址的属性,而Object.prototype
的对象,不是Function创造的.
- 对象里从来不会包含另一个对象,只是包含另一个对象的地址
- 要清楚知道
Object.prototype地址
和Object.prototype对象
的区别
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
存储对象的原型,等于#1019
, 用Function
创建Array
- 用
Array.prototype
存储数组的原型,等于#404
- 创建
window
对象
- 用
window
的'Object' 'Array'
属性将7和9
中的函数命名
- 记住一点, JS创建一个对象时,不会给这个对象名字的

- 构造函数的构造顺序
- 自己定义构造函数
Person
,函数里给this
加属性
Person
自动创建prototype
属性和对应的对象#502
- 在
Person.prototype #502
上面加属性
- 用
new Person()
创建对象p
new
会将p
的原型._ _proto_ _
设为#502
总结
- 构造函数
- 是用来构造对象的
- 会预先存好对象的原型,原型的原型是根new的时候将对象的
._ _proto_ _
指向原型
- 对象
- 所有对象都直接或间接指向根对象
- 如果对象想要分类,就在原型链上加一环用构造对象可以加这一环
- 继承