1、觀察者模式
觀察者模式(基于發(fā)布訂閱模式) 有觀察者,也有被觀察者。
觀察者需要放到被觀察者列表中,被觀察者的狀態(tài)變化需要通知觀察者。 內(nèi)部基于發(fā)布訂閱模式,收集觀察者;狀態(tài)變化后要主動通知觀察者。

2、發(fā)布訂閱模式
發(fā)布訂閱的核心: 每次event. emit(發(fā)布),就會觸發(fā)一次event.on(注冊)。

觀察者模式和發(fā)布訂閱模式的區(qū)別
觀察者模式和發(fā)布訂閱模式最大的區(qū)別就是發(fā)布訂閱模式有個事件調(diào)度中心,消除了發(fā)布者和訂閱者之間的依賴。
從下圖中可以看出,觀察者模式中觀察者和目標直接進行交互,而發(fā)布訂閱模式中統(tǒng)一由調(diào)度中心進行處理,訂閱者和發(fā)布者互不干擾。一方面實現(xiàn)了解耦,還有就是可以實現(xiàn)更細粒度的一些控制。比如發(fā)布者發(fā)布了很多消息,但是不想所有的訂閱者都接收到,就可以在調(diào)度中心做一些處理,類似于權(quán)限控制之類的。還可以做一些節(jié)流操作。

vue數(shù)據(jù)雙向綁定也用到了發(fā)布訂閱模式
3、事件總線
eventBus其實是一個典型的觀察訂閱模式,我們需要實現(xiàn):
1)訂閱事件on;
2)觸發(fā)事件emit;
3)移除事件off;

4、instanceof
instanceof 運算符用于檢測構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個實例對象的原型鏈上。
所以實現(xiàn)instanceof的思路就是判斷右邊變量的原型是否存在于左邊變量的原型鏈上。
1)先取得當前類的原型,當前實例對象的原型鏈
3)一直循環(huán)(執(zhí)行原型鏈的查找機制)
a、如果 一直找到Object.prototype.__proto__ == null,Object的基類(null)上面都沒找到,則返回false;
b、如果 當前實例的原型鏈__proto__上找到了當前類的原型prototype,則返回true;
c、取得當前實例對象原型鏈的原型鏈(proto = proto.__proto__,沿著原型鏈一直向上查找)。

5、Object.create

6、call、apply和bind
1)call的實現(xiàn)

2)apply的實現(xiàn)

2)bind的實現(xiàn)

7、防抖和節(jié)流
1)防抖

2)節(jié)流

8、函數(shù)柯里化
9、new
a、創(chuàng)建一個空的JavaScript對象(即{});
b、空對象的_proto_指向構(gòu)造函數(shù)的prototype,也就是將 obj.constructor 指向構(gòu)造函數(shù);
c、將this指向創(chuàng)建的對象上下文;
d、返回對象。

10、函數(shù)扁平化
