对象
什么时候必须使用['属性名']的方式?
- 属性名不是合法的标识名
- 属性名不确定
创建对象的几种方式
- 使用Object构造函数创建对象
- 开始时候是创建的一个空的Object对象实例
- 当向其对象中添加属性就要写一行代码
- 导致语句太多
* 套路: 先创建空Object对象, 再动态添加属性/方法
* 适用场景: 起始时不确定对象内部数据
* 问题: 语句太多
- 字面量创建对象
* 套路: 使用{}创建对象, 同时指定属性/方法
* 适用场景: 起始时对象内部数据是确定的
* 问题: 如果创建多个对象, 有重复代码
- 工厂模式创建对象
* 套路: 通过工厂函数动态创建对象并返回
* 适用场景: 需要创建多个对象
* 问题: 对象没有一个具体的类型, 都是Object类型
- 自定义构造函数创建对象
* 套路: 自定义构造函数, 通过new创建对象
* 适用场景: 需要创建多个类型确定的对象
* 问题: 每个对象都有相同的数据, 浪费内存
- 构造函数_原型的组合模式创建对象
* 套路: 自定义构造函数, 属性在函数中初始化, 方法添加到原型上
* 适用场景: 需要创建多个类型确定的对象
js继承
原型链继承
1. 核心思想
- 子类的原型 称为父类的实例
- Cilid.prototype = new Person();
2. 注意问题
- 以上写法会导致子类的构造器属性的丢失
3. 解决问题
- Child.prototype.constructor = Child;
function Person(name,age) {
this.name = name;
this.age = age;
}
Person.prototype.showName = function(){
console.log(this.name);
};
var person1 = new Person('hxt',23);
//子类的原型称为父类的实例对象
Child.prototype = new Person();
Child.prototype.constructor = Child;
person1.showName();
function Child(name,age) {
this.name = name;
this.age = age;
}
var child1 = new Child('c',2);
console.log(child1);
// Child.prototype.__proto__ = Person.prototype;
child1.showName();
借用构造函数继承(不是真的继承)
1. 核心思想
- 让父类的方法在子类中执行
2. 注意问题
- 如果父类的方法在子类中直接调用,会导致在window对象身上添加了不必要的属性
3. 解决问题
- 使用call || apply
- Parent.call(子类的实例对象, 参数)
- Parent.call(this, 参数)
组合继承
1. 核心思想
原型继承 + 借用构造函数继承
js事件循环(轮询)机制
1. js是单线程的 ---> 主线程
2. 同步任务 || 异步任务
- 同步
1. 阻塞的
2. 同步时没有回调的
- 异步
1. 非阻塞
2. 异步有回调(回调的作用: 用来通知当前异步任务执行的结果)
3. 定时器真的准时吗?
- 特例: 定时器任务的后面有运算量大的代码段(定时器不准时)
4. 事件轮询机制
1. 所有的js任务都会在js的主线程执行
2. 当开启一个异步任务的时候,会交给对应的管理模块去管理
3. 此时主线程继续执行后续的任务
4. 管理模块接管的对应的回调,它会在恰当的时机将对应的回调放入callback queue中
5. 当主线成上的所有同步任务执行完毕,会通过'轮询'的方式询问callback queue是否有可执行的回调
6. 假如没有会反复询问
7. 假如有可执行的回调,将对应的回调钩到主线程上执行
5. 开发注意事项
- 不要在定时器任务之后放置代码量大的代码段