基础篇
this指向的类型
new绑定
- 函数作为构造函数使用new调用时,
this
-绑定的是新创建的构造函数的实例-
function Foo(name){
this.name = name
}
const foo = new Foo('alex') // --> Foo {name: 'alex'}
显示绑定
- 通过
call、apply、bind
可以修改函数绑定的this,使其成为我们指定的对象
function Foo(name, price){
this.name = name
this.price = price
}
function Food(cat, name, price) {
Foo.call(this, name, price)
this.cat = cat
}
new Food('食品', '汉堡', 25) // --> Food {name: '汉堡', price: 25, category: '食品'}
call
和apply
的区别:call
接受的是一组参数列表,而apply
接收的是一组参数数组bind
是设置this
为给定的值,且返回一个新函数。在调用新函数时,将给定参数列表作为原函数的参数序列的前若干项。
const food = {
name: '汉堡',
price: '5块钱',
getFoodMsg: function(place) {
console.log(`${place}的${this.name}价格是${this.price}`)
}
}
const getPrice = food.getFoodMsg.bind({ name: '宫保鸡丁', price: '10块钱' }, '肯德吉')
getPrice() // --> '肯德吉的宫保鸡丁价格是10块钱'
隐式绑定
- 函数是否在某个上下文对象中被调用,如果是的话
this
绑定的那个上下文对象。 - 函数被调用时,
this
一般指向.
左边的对象
obj.func() // --> this指向obj
默认绑定
- 函数独立调用,直接使用不带任何修饰的函数引用进行调用。
this
根据严格/非严格模式下会有两种指向情况: - 非严格模式:
this
指向全局对象 (浏览器是window,node是global) - 严格模式:
this
指向undefined
(严格模式不允许this指向全局对象)
this杂记
this
是在函数被调用是确定的,它的指向完全取决于函数调用的地方,而不是它被声明的地方(箭头函数除外)- 如果把
undefined
或null
作为this
的绑定对象传递给call、apply、bind
,这些值在调用时会被忽略,实际应用的是默认绑定原则
this绑定的优先级
创建型模式
创建型模式关注如何创建对象,主要特点是将对象的创建和使用分离。一般抽象了对象实例化的过程,用来帮助创建对象的实例。
单例模式
: 保证一个类只有一个实例,并提供一个访问它的全局访问点;工厂模式
: 根据输入的不同返回不同类的实例,一般用来创建同一类对象;抽象工厂模式
: 通过对类的工厂抽象,使其业务用于对产品类簇的创建;建造者模式
: 分步构建一个复杂对象,使得同样的构建过程可以采用不同的表示;
结构型模式
结构型模式关注如何将对象按某种布局组成更大的结构。
代理模式
: 为目标对象创造一个代理对象,以控制对目标对象的访问;享元模式
: 运用共享技术来有效地支持大量细粒度对象的复用,减少创建的对象的数量;适配器模式
: 解决两个软件实体间接口不兼容的问题;装饰者模式
: 向一个现有的对象添加新的功能,同时又不改变其结构;外观模式
: 为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问;组合模式
: 用小的子对象构建更大的对象,使得对单个对象和组合对象具有一致的访问性;桥接模式
: 将类的抽象部分与实现部分分离,使它们可以独立地变化;
行为型模式
行为型模式关注对象之间的通信,描述对象之间怎样相互协作,以及怎样分配职责。
发布 - 订阅模式
: 多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为;策略模式
: 定义了一系列算法,并将每个算法封装起来,使它们可以相互替换;状态模式
: 允许一个对象在其内部状态发生改变时改变其行为能力;模板方法模式
: 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤;迭代器模式
: 提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示;命令模式
: 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开;职责链模式
: 把请求从链中的一个对象传到下一个对象,直到请求被响应为止;中介者模式
: 定义一个中介对象来简化原有对象之间的复杂耦合关系;
一些其他模式
MVC、MVP、MVVM
: 用于系统分层,降低层间耦合;模块模式
: 将内部的属性和方法隐藏,仅暴露需要暴露的部分;链模式
: 通过在对象方法中将当前对象返回,实现对同一个对象的多个方法的链式调用;中间件
: 处于操作系统和应用程序之间的软件,来完成对任何数据的预处理和后处理;