Appearance
前言
记录一些必须掌握的es6
Proxy
如其名,代理,能够对对象的操作进行代理,未代理的都会直接转发到对象上。
js
const obj = {
_a: 'obj'
}
const proxyObj = new Proxy(obj, {
get(target, prop, receiver) {
console.log(`${prop}: ${target[prop]}`)
return target[prop]
},
set(target, prop, value, receiver) {
console.log(`set ${prop}: ${value}`)
target[prop] = value
}
})
proxyObj.a
// a: obj
// obj
// 打印上面两行上面可以看出就是对象的代理,函数也是对象的一种,也能对函数的执行,new 示例的执行监听。
- get(target, prop, receiver) 代理 [[get]]
- set(target, prop, value, receiver) 代理[[set]]
- deleteProperty(target, prop, receiver) 代理 [[delete]]
- has(target, prop, receiver) 代理 in 查询对象,以及原型上面是否存在某个属性
- ownKeys(target, receiver) 代理 for in, Object.keys(), getOwnPropertyNames, getOwnPropertySymbols的操作
- defineProperty(target, prop, descriptor) 代理 Object.defineProperty和Object.defineProperties()
- getPrototypeOf() setPrototypeOf()
- apply(target, thisArgs, ...args) 代理函数的调用,包括call或者bind等调用
- constructor() 如果一个代理对象被用作 new 示例,介入执行。
Reflect
翻译成映射,值得是将一些操作映射成函数的执行,从而判断执行的成功与否。
js
const obj = {
_a: 'obj'
}
const proxyObj = new Proxy(obj, {
get(target, prop, receiver) {
return target._a
},
})
const objA = Object.create(proxyObj)
objA._a = 'objA'
objA.a // 期待返回ObjA, 结果是 obj
// 改写如下
const proxyObj = new Proxy(obj, {
get(target, prop, receiver) {
return Reflect(target, prop, receiver)
},
})上面的例子proxy 总是有对应的Reflect来处理某些被忽略的错误的操作。除此之外if(Reflect.set(obj, 'a')) 还能判断是否该操作成功执行
Map 和 Set
Map是哈希表,取代长期使用object当做hash的问题。get, set, has, delete, size, clear,支持迭代 keys, values, entries,forEach。同时还保留了插入顺序迭代,解决了hash表无序问题。支持Map和Object互转 new Map(Object.entries({a: 1})) 或者 Object.formEntries(xxx.entries()),额外的特性还有支持任意类型键
Set 是一个无重复项的hash表(每个值就是一个键)。 add, delete, has,clear, size 和Map一样也支持迭代,本身就是一个可迭代对象,直接for of或者自带forEach 方法。 和Array可以相互转 Array.from(set)
set 常用于数组去重 [...new set([1,1,3,4])] Set 参数支持可迭代对象和数组, 还有当队列用,set.values().next() 总是先入先出
可迭代对象和迭代器
如果一个对象具有Symbol.iterator 属性,这个对象就是可迭代对象,可迭代对象被用于各种地方,比如new Set() Array.from() for of。 Symbol.iterator 返回一个迭代器,任何具有next() 并返回{ value: any, done: boolean }的对象都是一个迭代器,迭代器还能由迭代器生成函数Generator产生(function*() {})
大部分内置对象都实现了迭代接口,比如Array,String,Set,Map
js
class A {
[Symbol.iterator]: function*() {
yield 1;
yield 2;
yield 3;
}
}
for(const i of new A) {
console.log(i) // 1 2 3
}还有一种是可迭代迭代对象,就是迭代器本本身也是一个可迭代对象
js
const some = ((count) => {
return {
[Symbol.iterator]() {
return this;
}
next() {
if(count >= 5) {
return { done: false , value }
}
return { value: value++, done: false}
}
}
})(0)
some.next(); // 可以作为迭代器使用
for(const i of some) {} // 作为可迭代对象使用Generator迭代器生成函数
用于生成迭代器,每次迭代器迭代时函数才执行,
js
function* a(count) {
console.log(count)
count = yield 3
console.log(count)
return
}
b = a(2)
b.next(1) // 只有yield 才能接受参数,1会被忽略
b.next() //