### 语言知识
1. 编辑语言总体分为两大类:静态语言 动态语言
静态语言优点:在编译时就能发现类型不匹配的错误,明确了数据类型,编译器还能进一步优化
静态语言缺点:代码冗长
动态语言优点:代码简洁,编写更快
动态语言缺点:增加类型不确定的风险
2. 鸭子类型:即只关注对象是否拥有某个方法,而不去关注是哪个对象,不管是鸡还是鸭,只要都会同一项技术就可以
### 多态思想
1. 把“做什么 和 谁去做”分离开来
2. 导演案例:导演喊"action",如果是面向过程写法,需要向不同的角色都说一句,如果是面向对象过程,
提前封装好方法,导演呼叫开始,叫一次就可以了,各个角色开始做自己的事情
```
function renderMap( map ) {
if (map.show instanceof Function) {
map.show()
}
}
function google() {}
function baidu() {}
let obj = {
show() {
console.log('google')
}
}
let obj2 = {
show() {
console.log('baidu')
}
}
Object.setPrototypeOf(google, obj)
Object.setPrototypeOf(baidu, obj2)
renderMap( google )
renderMap( baidu )
```
### 封装
1. 封装思想:封装的目的是为了隐藏信息
2. 一般封装是:封装数据、封装实现这两种
### 封装数据
1. 通过闭包实现私有变量,本质是通过作用域的特性去封装
### 1. 单例模式
1. 保证一个类只有一个实例,并提供一个访问它的全局访问点
### 2. 发布订阅与观察者模式:也称为观察者模式
1. 它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变,所有依赖它的对象都将得到通知
2. 在JS中,事件模型也是一种替代传统的发布订阅者模式
### 3. 适配器模式
1. 适配器模式主要的作用是解决两个软件之间的不兼容问题
2. 现实生活中的适配器:充电器转换头、USB转换头等
2.