1-Object.defineProperty
这个方法是用来为对象新增属性或者修改对象属性并返回这个对象的。
属性描述符分为数据描述符和访问器描述符;
不是专门用于劫持对象属性的方法,想要监听属性的新增与删除也是无法做到的。
2-Proxy提供对于对象的代理
proxy类是es6提出的用于代理对象的,当我们想要监听外界对于对象的操作的时候我们使用new Proxy创建一个proxy对象,传入需要监听的对象和处理对象,这样外界对于被监听对象的操作都通过这层代理对象完成,也就可以监听对象的操作;
传入的handler对象里面内置了很多方法,对外暴露对对象可以进行的操作,set、get、has、deleteProperty【增删查改哈哈】
对象中以key-value的方式存储的。
let proxy = new Proxy(obj, {
//target是被监听的对象
//receiver是调用的代理器对象,receiver参数只有在get、set方法里有,可以改变里面的this
set(target, key, value, receiver) {
target[key] = value
},
get(target, key, receiver) {
console.log(target)
console.log(typeof target)
return target[key]
},
has(target, key) {
//查找属性是否在目标对象及其原型上
return key in target
},
deleteProperty(target, key) {
delete target[key]
},
construct(target, args, newTarget) {
//所以target是函数对象吗
//return new target(args)
return Reflect.construct(target,args,newTarget)
},
apply(target, thisArg, otherArgs) {
//修改this指向,apply(this对象,数组)
target.apply(thisArg, otherArgs)
}
})
3-Reflect提供很多操作对象的方法
Reflect.defineProperty等方法等同于Object.defineProperty这些,因为Object是个构造函数,我们直接在上面操作属性是很奇怪的,将操作对象的方法集中到Reflect对象上面变得规范,通过Proxy是代理对象,我们可以将Proxy和Reflect结合,做到代理对象监听对象属性变化同时还可以不操作原对象。
常用方法和Proxy差不多:get、set、has、deleteProperty、apply、construct
let obj = {
name: "yyy",
age: 21
}
let proxy = new Proxy(obj, {
//target是被监听的对象
//receiver是调用的代理器对象
set(target, key, value, receiver) {
// target[key] = value
Reflect.set(target,key,value)
},
get(target, key, receiver) {
console.log(target)
console.log(typeof target)
// return target[key]
return Reflect.get(target,key)
},
has(target, key) {
//查找属性是否在目标对象及其原型上
// return key in target
return Reflect.has(target,key)
},
deleteProperty(target, key) {
// delete target[key]
Reflect.deleteProperty(target,key)
},
construct(target, args, newTarget) {
//所以target是函数对象吗
return new target()
},
apply(target, thisArg, otherArgs) {
//修改this指向,apply(this对象,数组)
target.apply(thisArg, otherArgs)
}
})
console.log(obj.name)
4-Promise异步编程的解决方案,解决回调地狱问题
Pomise是一个类,使用new实例化这个类的时候传入一个回调函数,这个回调函数被立即执行,这个函数传入两个参数resolve回调函数和reject回调函数;
当我们执行resolve回调函数的时候【状态变成fufilled的时候】会执行Promise对象的then方法,执行reject回调函数的时候执行的是Promise对象的catch方法;
Promise使用的时候分为三个状态,pending状态也就是开始未决定的状态;当resolve回调成功执行了就会变成fufilled已完成状态;当reject回调执行了状态变成rejected拒绝状态;
resolve回调函数传入的参数可以是普通数据也可以是回调函数,如果传入的参数不是回调函数的时候,会将状态变成fufilled状态,reject方法还会执行但是状态被确定不会改变了。
但是传入resolve函数的参数是一个Promise或者是实现了then方法的对象的时候,会根据新的Promise以及then方法的状态决定旧的Promise的状态;
then方法和catch方法都是promise对象的实例方法,then方法传入fufilled回调,状态变成fufilled的时候调用这些then方法;catch方法传入rejected回调,状态变成rejected的时候调用这些catch方法;
then方法和catch方法都返回Promise对象,所以都可以链式调用。
返回的Promise处于什么状态呢?
如果是回调函数执行中pending,回调函数执行完成得到一个结果【普通数据、Promise、实现了then方法的对象】的时候状态变成fufilled;如果抛出异常的时候变成reject状态;
5-async和await
async是标记异步函数的关键字;
异步函数和普通函数的区别:
异步函数内部执行和普通函数一样,但是异步函数的返回值会被Promise.resolve函数的参数,如果是返回的Promise或者实现了then方法的对象会根据实现结果决定promise的状态;在异步函数里面抛出异常,是会作为reject函数的参数,也就是异常需要通过then或者catch方法获取。
aswit关键字是在async标记的异步函数内部使用,后面跟一个返回Promise的异步函数,根据异步函数最终状态决定最终的结果,并使用常量接收这个结果,达到用书写同步代码的方式使用异步函数;【通俗来讲,也就是等待异步执行结果并将异步结果赋值给常量】