JS的知识点
基本概念
- 内存
- 变量
- 数据类型
- 对象
控制语句
- if...else...
- for...
对象
- 原型、原型链
- 对象分类
- new一个新对象
- 构造函数
- this 的隐士传递和显示传递
三个最重要知识:
- JS公式:
对象.__proto__ === 其构造函数.prototype - 根公理:
Object.prototype是所有对象的(直接或间接)原型 函数公理:
- 所有函数都是由Function构造的
- 任何函数.__proto__ === Function.prototype
- 任意函数都有Object/Array/Function
容易犯错观点
- {name:‘frank’}.__proto__ 的原型 === Object.prototype
- [1,2,3].__proto__ 的原型 === Array.prototype
- Object.__proto__ 的原型 === Function.prototype
问题:
Object的原型是Object.__proto__?
解读:
对的. [的原型]等价于[.__proto__];中文的[原型]无法区分.__proto__与prototype。所以默认约定了原型用.__proto__。
但是并不意味这两个是完全相等的意思
观点矛盾:
- [1,2,3]的原型是Array.prototype
- Object.prototype是所有对象的原型
- 为什么Object.prototype不是[1,2,3]的原型呢?
解读:
- 原型分2种情况,直接原型和间接原型
- 对于普通对象来说,Object.prototype是直接原型
- 对于数组,函数来说,Object.prototype是间接原型
错误观点:
Object.prototype不是根对象(X)
理由:
- Object.prototype是所有对象的原型
- Object.prototype是Function构造出来的
- 所以,Function构造了Object.prototype
- 推论,Function才是万物之源
解答:
- Object.prototype 和 Object.prototype对象 的区别
- 对象里面从来不会包含另一个对象,只会包含另一个对象的地址
- Function构造了Object.prototype的地址,并没有构造那个对象,Object.prototype是根对象,但是不能说Function就是根对象,只能说构造出存储根对象地址的属性
Object.prototype 和 Object.prototype对象 区别:
- 就代码而言,没办法区分,只能用内存图来区分,有2个意思
- Object.prototype在Objec里面,因为这里的prototype指2个东西:地址和对象,在中文描述时,默认地址就是那个对象。
- 如果问Object.prototype这个地址对应的对象在不在Object里面?回答是不在,因为它在路径#202[toString...](这里内存图随便一个地址)里面,而Object在prototype:#202这个位置
JS世界构造顺序
- 创建根对象#101(toString),根对象没有名字
- 创建函数的原型#208(call/apply),原型__p为#101
- 创建数组的原型#404(push/pop),原型__p为#101
- 创建Function #342(构造函数),原型__p为#208
- 让Function.prototype等价于#208(有名字了)
- 让此时发现Function的__proto__和prototype都是#208
- 用Function创建Object(实际没有名字)
- 让Object.prototype等价于#101(有名字了)
- 用Function创建Array(实际没有名字)
- 让Array.prototype等价于#404(有名字了)
- 创建window对象(不属于JS世界)
- 用window的'Object''Array'属性将7和9中的函数命名
- 记住一点,JS创建一个对象,不会给这个对象名字
示例
- Object.prototype.__proto__ === null
- Function.prototype.__proto__ === Object.prototype
> var f = () => {} < undefined
- f.__proto__ === Function.prototype
- Funciont.__proto__ === Function.prototype
- Array.prototype.toString.__proto__ === Funciont.prototype
- Object.__proto__ === Function.prototype
- Array.prototype === [].__proto__(公式反着用)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。