JS 4


Subclassing

ES5

function MyMap() {}

MyMap.prototype = Object.create(Map.prototype)
// constructor
var map = new MyMap()
map.set("c", 3) // error

ES6

class MyMap extends Map {
  constructor() {
    // this not working
    super(...arguments)
    // this working
  }
}

Homework

new Date(dateInstance) - посмотреть в время в мс
new RegExp(/smth/gi) - просто скопирует из готового

if (from instanceof Date || from instacneof RegExp
  || from instanceof Map || from instanceof Set)
value instanceof C - вызывается
C[Symbol.hasInstance](value)

from instanceof [Date, Map, Set, RegExp]
Array.prototype[Symbol.hasInstance] = function(v) {
  return this.some(c => v instanceof c)
}

from instanceof some(Date, Map, Set, RegExp)
{}.toString.call(value) == "[object Map]"

value[Symbol.toStringTag] == "Map"

Symbol.match in value
... String#replace, split, search

Promise

вместо node callback hell

микротаск - после выполнения текущего кода, но перед раскручиванием event-loop
таск - во время event-loop
link

Promise.all в this ожидает конструктор промисов, просто так взять не можем.

Promise.reject(5)
  .then(console.log) // miss
  .then(console.log) // miss
  .catch(num => 6) // если не throw, то then, если throw, то catch
  .then(value => 6)

link


Работа прототипов

var obj = Object.create({ a: 1 })

obj.a
obj.a[[Get]]("a")
function [[Get]](key) {
  var desc = Object.getOwnPropertyDesc(this, key)

  if (desc == null) {
    var proto = Object.getPrototypeOf(this)
    var desc = Object.getOwnPropertyDesc(proto, key)
    и так пока getPrototypeOf не вернет null
  }
}

delete obj.a
obj.[[Delete]]("a")
взяли, посмотрели configurable или нет, если да, то удалили и возвратили true

var arr = []
arr[0] = 10

arr.[[Set]]("0", 10) ->
arr.[[DefineProperty]]("0", {
  value: 10,
  e: true,
  w: true,
  c: true
})

Эти методы можно менять при помощи Proxy API

Proxy

var target = { a: 1 }
var proxy = new Proxy(target, {
  get(target, key) {
    return key
  }
})

proxy.asd // asd

kharkiv js proxises
code

Вместо
obj[key] === undefined
проверять
key in obj
тогда активируется has trap

Для чего юзать:

Reflect

у нас на каждую proxy-trap есть рефлект и если мы хотим зарефлектить trap на другой объект, то юзаем Reflect

Reflect.get(...arguments)
Reflect.set(anotherT, ...args.slice(1))

2ality proxy + reflect