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)
Работа прототипов
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
Вместо
obj[key] === undefined
проверять
key in obj
тогда активируется has trap
Для чего юзать:
- thenless promises (proxise)
- promisify
- API wrappers
- regexp
r.igm`${} \n`
Reflect
у нас на каждую proxy-trap есть рефлект и если мы хотим зарефлектить trap на другой объект, то юзаем Reflect
Reflect.get(...arguments)
Reflect.set(anotherT, ...args.slice(1))