小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
发布者-订阅者模式
//发布-订阅模式
class EventEmitter{
constructor(){
this.subs = Object.create(null)
}
$on(eventType, handler){
this.subs[eventType] = this.subs[eventType] || []
this.subs[eventType].push(handler)
}
$emit(eventType, params){
if (this.subs[eventType]) {
this.subs[eventType].forEach(handler => {
handler(params)
})
}
}
}
let em = new EventEmitter()
//订阅
em.$on('click', (params)=>{
console.log('点击', params);
})
em.$on('click', (params)=>{
console.log('点击', params);
})
//发布
em.$emit('click', 1111111)
观察者模式
//观察者模式
class Subject{ // 1.被观察者
constructor(name){
this.name
this.observers = []
this.state = '开心'
}
attach(o){
this.observers.push(o)
}
setState(newState){
if (this.state !== newState) {
this.state = newState
this.notify(newState)
}
}
notify(newState){
this.observers.forEach(o => o.update(newState))
}
}
class Observer{
constructor(name){
this.name = name
}
update(state){
console.log(`${this.name}:当前的状态是${state}`);
}
}
// 我家有个小宝宝 , 爸爸和妈妈要关心小宝包的状态 , 小宝宝不开心 会主动通知观察者
let s = new Subject('宝宝');
let o1 = new Observer('爸爸');
let o2 = new Observer('妈妈');
s.attach(o1)
s.attach(o2)
s.setState('不开心');
s.setState('开心');
Promise.all
Promise.all = function all(promises){
if(!Array.isArray(promises)) throw new TypeError(promises + 'must be an Array')
var n = 0,result = []
return new Promise(function (resolve, reject){
for(var i = 0; i < promises.length; i++){
(function(i){
var promise = promises[i]
if(!isPromise(promise)) promise = Promise.resolve(promise)
promise.then(function onfullfilled(value){
n++;
result[i] = value
if( n >= promise.length) resolve(result)
}).catch(function onrejected(reason){
reject(reason)
})
})(i)
}
})
}
检测是否是纯粹对象 直属类是Object || Object.create(null)
//检测是否是纯粹对象 直属类是Object || Object.create(null)
const isPlainObject = function isPlainObject(target) {
let proto,//target的原型
Ctor
if (!target || Object.prototype.toString.call(target) !== '[object Object]') return false
proto = Object.getPrototypeOf(target)
if (!proto) return true
Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor
let ObjectFunctionString = Function.prototype.toString.call(Object); //"function Object() { [native code] }"
return typeof Ctor === "function" && Function.prototype.toString.call(Ctor) === ObjectFunctionString
}