1.JS唯一公式
对象.__proto__ === 其构造函数.prototype
2.根公理
(公理是人为规定的,是不容置疑的)
Object.prototype
是所有对象的(直接或间接)原型
3.函数公理
- 所有函数都是由Function构造的
任何函数.__proto__ === Function.prototype
- 任何函数包括:Object、Array(数组)、Function
4.难点
- [的原型] 等价于
.__proto__
只不过.__proto__
正好是某个函数的prototype
- 直接原型和间接原型
对于普通对象来说,Object.prototype
是直接原型
对于数组、函数来说,Object.prototype
是间接原型 Object.prototype
和Object.prototype 对象
的区别
Object.prototype
表示一个地址
这个地址对应的对象是根对象(语言上依旧认为:地址就是对象)
Function
是构造除了Object.prototype
这个地址,不是对象。
对象里从来都不包含另一个对象
JS世界
1.JS世界的构造顺序
- 创建根对象#101(toString、value of,其原型设定null),根对象没有名字
- 创建函数的原型#208(call、apply),原型
__p
为#101 - 创建数组的原型#404(push、pop),原型
__p
为#101 - 创建没有名字的
Function
函数#342,原型__p
为#208 - 让
Function.prototype
等于#208 - 此时发现
Function.__proto__ ===Function.prototype
- 用Function创建
Object
#909(实际没有名字),原型__p
为#208(公式,等于其构造函数的prototype值) - 让
Object.prototype
等于#101(把对象的原型地址存到上面),而Object是对象的构造函数,因此对象.__p === Object.prototype
- 用Function创建
Array
#1101(实际没有名字),原型__p
为#208(公式,等于其构造函数的prototype值) - 让
Array.prototype
等于#404(把数组的原型地址存到上面)。 - 创建window对象(不属于JS世界是浏览器的)
- 用window的
Object
、Array
、Function
属性将7和0中的函数命名
如:window.Object、window.Array、window.Function
从这一刻起,Object和Array才有了名字,其值分别为#909、#1101 - 记住一点,JS创建一个对象时,不会给这个对象名字的,要有了window对象才会有名字
我们要通过名字才能访问这个对象
根是没有名字的,它是一出生就有的
只能说:window.Object.prototype
存了根对象的地址。
2.构造函数
- 用
new Object()
创建 obj1 - new会将obj1的原型__p设置为Object.prototype
- Array和Funcitont同理
3.漂亮的图示
4.总结
4.1 构造函数
- 是用来构造函数的
- 会预先存好对象的原型,原型的原型是根
- new的时候会讲对象的__p指向原型
4.2 对象
- 所有对象都直接或间接指向根对象
- 如果对象想要分类,就在原型链上加一环
- 用构造函数可以加这一环
4.3 思考问题
Object.prototype
的原型是什么?
思路:[的原型]就是问__p
是什么
答:根据7个数据类型推测,Object.prototype
是对象,对象的原型等于其构造函数的prototype
,但由根公理Object.prototype
是所有对象的原型得到它是根对象,因此原型为nullFunction.prototype
的原型是什么?
答:Function.prototype.__p__ === Object.prototype
Function
的原型是什么?
答:由公式得Funcition.__proto__ === Function.prototype
Array.prototype.toString
的原型是什么?
答:Array.prototype.toString
是一个函数,函数的构造函数是Function,由公式得到其原型是Function.prototype
JS学习计划
- 第一阶段
了解:JS语法、特性、对象、数组、函数等 - 第二阶段
了解:AJAX、设计模式、封装、面向对象、MVC - 第三阶段
Vue和React全家桶