- 面向对象编程思维
- 提高代码的可复用率 => 更加合理的数据关系
- 隐式原型和显式原型
- 对象的隐式原型和构造函数的显式原型的连接
- 原型链机制核心
a. new:执行前绑定this并指向空对象, 将对象的隐式原型指向函数的显式原型
b.[[GET]]
Object和Function
关键点
- Object.prototype.
__proto__
= null => 原型链的终点; 不是所有对象都是Object的实例 - Function.prototype.
__proto__
= Object.prototype => new Object() - Object.
__proto__
= Function.prototype => new Function() - Function.
__proto__
= Function.prototype => 指向自己, 执行前通过代码注入
instanceof方法
instanceof
a instanceof Func
- 本质:递归
- 作用:判断 a 是不是 Func 的一个实例
- s1.
__proto__
= Student.prototype -> false - Student.prototype.
__proto__
= Object.prototype -> true
- s1.
1 | function Student(name, sex, age, major) { |
数组和类数组
数组和类数组的区别
本质上是原型链上的区别
1 | var a = ['1', '2', '3']; |
隐式原型的修改
隐式原型的修改
- Object.getPrototypeOf(obj) -> 返回参数对象的隐式原型
- Object.setPrototypeOf(obj, obj) // 不推荐
- Object.create() // 返回一个以obj为隐式原型的值的对象
- 如何得到一个没有任何属性的对象
var o = Object.create(null);
- 如何得到一个没有任何属性的对象
[[PUT]]
&&[[GET]]
[[PUT]]
[[PUT]] -> LHS 左查询
- 判断对象中有没有属性
- 如果有, 就找到并返回该地址
- 如果没找到
- (1) 沿着原型链找
- A. 找到这个属性
- (a). 如果是基本类型 -> 覆盖 -> 在对象自身创建这个属性并返回
- (b). 引用类型:
- xxx. 对引用类型的引用 -> 覆盖
- yyy. 对引用类型的访问 -> 修改
- A. 找到这个属性
- (2) 没有找到 -> 直到原型链终点 -> 给对象自身创建一个
- (1) 沿着原型链找
1 | var bar = new Object(); |
面试题
面试题 - 01
1 | function A() {} |
面试题 - 02
1 | function A () {}; |
面试题 - 03
1 | function Person(name, age) { |
面试题 - 04
1 | function foo() { |