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_ _指向原型
- 对象
- 所有对象都直接或间接指向根对象
- 如果对象想要分类,就在原型链上加一环用构造对象可以加这一环
- 继承