事件循环 & 继承 杂记

2021-12-02  本文已影响0人  YM雨蒙

事件循环

  1. 事件: 键盘事件, 其他东西触发的, 统称为事件
  2. 轮询: 操作系统通过轮询的方式, 每个一段时间就询问事件有没有触发

  1. JS: 浏览器
console.log(1)
console.log(2)
console.log(3)

// js 是单线程, 发消息告诉 c++ , 轮询 ajax 事件
ajax() // 假如等待事件 1s, -> (操作系统/浏览器/...) 会轮询, 直到事件的发生

// 会继续执行, 不受 ajax 事件影响 
console.log(4)
console.log(5)
console.log(6)
  1. Node.js
    node.js EventLoop(事件循环)的过程
setImmediate(() => {
  console.log('setImmediate1)
  setTimeout(() => {
    console.log('setTimeout1)
  }, 0)
})

setTimeout(() => {
  console.log('setTimeout2)
  setImmediate(() => {
    console.log('setImmediate2)
  })
}, 0)

// 分析 eventloop 阶段
1. timer
2. poll
3. check

上面代码: 第一个 setImmediate 会进入 check 阶段立即执行, 第一个setTimeout 会进入 timer, 放入第一个队列, 然后 第一个 setImmediate 里面的 setTimeout 会被放入 timer 阶段 第二个, 

==> 先打印 setImmediate1 -> 然后 打印 setTimeout2 -> 继续 timer 阶段 setTimeout1 -> 最后回到check 阶段 -> setImmediate2

总结

Node.js 的 EventLoop 的几个阶段: timers poll check, 顺序是: timers -> poll -> check -> timers

  1. Node.js
  1. chrome

继承与组合

类知识简介

  1. 为什么有类?
  1. 为什么有继承
// 两个对象属性重复
let person1 = {
  name: "yym1",
  age: 12,
  sayHi() {},
}

let person2 = {
  name: "yym2",
  age: 18,
  sayHi() {},
}

// 使用 class 把上面重复的弄出来, 我们可以创建很多 person
class Person {
  name
  age
  sayHi
  constructor(name, age) {
    this.name = name
    this.age = age
  }
}

let person1 = new Person("yym1", 12)
let person2 = new Person("yym2", 18)
// 函数都是共用的?

// 给每个对象自身加一个函数
class Person {
  mySayHi = () => {} // 自用
  sayHi()
}

let person1 = new Person()
let person2 = new Person()

person1.sayHi === person2.sayHi // true
person1.mySayHi === person2.mySayHi // false

// 箭头函数没有 this, 使用外面的 this

继承

假设我们有两个类 都需要一个功能: 发布订阅功能, 但其他功能不一样, 如果我们每个类都写一个 发布订阅 就有点重复了, 所以我们写个类 只有发布订阅功能

// 发布订阅
class EventEmitter {
  constructor() {}
  catch = []
  on() {}
  off() {}
  emit() {}
}

class Person extends EventEmitter {
  name
  constructor(name) {
    super()
    this.name = name
  }
}
class 其他 extends EventEmitter {
  name
  constructor(name) {
    super() // 调用父的方法和属性
    this.name = name
  }
}

继承的其他功能: 重写

class Person extends EventEmitter {
  name
  constructor(name) {
    super()
    this.name = name
  }
  on(eventName, fn) {
    console.log('我要监听了)
    super.on(eventName, fn)
  }
}

继承的问题? 如果需要更多的功能 => 使用组合

组合

你要什么我复制给你,

class Person {
  name
  sayHi()
} 
let person1 = new Person('frank')

mixin(person1,  new EventEmitter())

// mixin 简单实现
function mixin(to, form) {
  for(let key in from ) {
    to[key] = from [key]
  }
}


// 需要更多功能
mixin(person1,  new EventEmitter())
mixin(person1,  new 飞())
mixin(person1,  new 杀())

有了组合, 你不需要 class, 直接函数 + 闭包 (后续写篇博客)

上一篇下一篇

猜你喜欢

热点阅读