promise
1.promise是什么:
所谓Promise
,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。promise是异步编程的一种解决方案。
2.promise对象的三种状态
创建promise对象有三种状态
- Pending 进行中,初始状态,既不是成功,也不是失败状态
- Resolved(已完成,又称 Fulfilled)
- Rejected(已失败)
编程封装
js面向对象编程(oop)
- 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
- 面向对象编程三大要素: 封装、多态、继承
面向对象编程之封装
多态:允许将子类类型的指针赋值给父类类型的指针;原生JS是弱类型语言,没有多态概念
this 指向
1.new关键字的作用
- 自动创建临时对象 ( 在函数内部使用this可以访问到这个临时对象 )
- 自动绑定该Function对象的原型 ( 统一叫做prototype )
- 把传入的参数赋给给临时对象
- 自动return这个临时对象
2.call、apply 和bind有什么区别?
三者都会改变this的指向, 区别:
- call 和 apply 的功能相同,区别在于传参的方式不一样:
- call的第一个参数是this要指向的对象, 第二个,第三个….都是调用函数需要的参数。
- apply第一个参数是this要指向的对象, 第二个参数是数组或类数组。
bind 和 call/apply 有一个很重要的区别,
一个函数被 call/apply 的时候,会直接调用,但是 bind 会创建一个新函数, 不会直接调用这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this, 新函数的调用和原来函数的调用一模一样,除了this的指向不一样之外
3.this指向
1. 方法调用, 谁调用指向谁
2. 函数里的函数调用
3. 构造函数中的this指向创建出的对象。
4. 存在call、apply和bind这三个方法的时候, this指向了传入的对象
编程继承
原型: 原型指的是原型对象, 每一个构造函数都会有一个对应的原型对象, 同时原型对象也存在一个指针(属性),指向了它的构造器.
原型链:
- 我们创建的每一个实例, 都存在一个内部指针(属性,叫
__proto__
), 指向了它的原型对象, 并且会继承原型对象的属性和方法 - 假如我们让原型对象等于另一个类型的实例, ,此时的原型对象将包含一个指向另一个原型对象的指针,假如另一个原型对象又是另一个类型的实例, 那么上述关系依然成立,如此层层递进,就构成了实例与原型的链条。这就是所谓原型链的基本概念。
js继承
原型继承: 让子类的原型对象=父类的实例
缺点:- 父类的引用类型属性会被所有子类实例共享,任何一个子类实例修改了父类的引用类型属性,其他子类实例都会受到影响
- 创建子类实例的时候,不能向父类传参
借用构造函数继承
在子类的构造函数中调用父类的构造器实现继承- 优点:
- 避免了引用类型属性被所有实例共享
- 可以向父类传参
- 缺点:
- 方法必须定义在构造函数中, 定义在父类原型对象上的方法无法继承
- 每创建一个实例都会创建一遍方法
- 优点:
- 寄生式继承
- 需要先传入一个对象, 再往对象上添加属性或方法, 就好像寄生一样(想象一下黄蜂是怎么养育后代的)
- 就是创建一个封装的函数来增强原有对象的属性,缺点跟借用构造函数一样,每个实例都会创建一遍方法
- 组合式继承(第1种和第2种组合)
- 既有原型继承,也借用了父类的构造函数
- 组合式继承方式唯一的缺点是,父类的构造函数会被调用两次
- 寄生组合式继承(最完美的继承方式)
完美的继承方式应该是这样:- 属性定义在父类构造函数里, 并且这些属性被子类继承的时候不会相互影响
- 公共方法定义在父类的原型对象里, 子类可以共享这些方法