1. get方法的第三个参数的例子,它总是指向原始的读操作所在的那个对象,一般情况下就是 Proxy 实例。
2. get : 如果一个属性不可配置(configurable)且不可写(writable),则 Proxy 不能修改该属性,否则通过 Proxy 对象访问该属性会报错。
3. set方法的第四个参数receiver,指的是原始的操作行为所在的那个对象,一般情况下是proxy实例本身
4. set 如果目标对象自身的某个属性不可写,那么set方法将不起作用。
5. set代理应当返回一个布尔值。严格模式下,set代理如果没有返回true,就会报错。严格模式下,set代理返回false或者undefined,都会报错
1. apply() 拦截函数的调用,call和apply方法
1. has 判断对象是否具有某个属性,典型的操作就是In 操作符
2. has()方法拦截的是HasProperty操作,而不是HasOwnProperty操作,即has()方法不判断一个属性是对象自身的属性,还是继承的属性。
3. 另外,虽然for...in循环也用到了in运算符,但是has()拦截对for...in循环不生效。
1.construct() 拦截new 命令
2. construct()方法中的this指向的是handler,而不是实例对象。
3. construct()返回值必须是一个对象,而且拦截的目标也必须是一个对象
1. deleteProperty 拦截delete命令,
2. 目标对象自身的不可配置(configurable)的属性,不能被deleteProperty方法删除,否则报错。
1.defineProperty 拦截了Object.defineProperty 操作
2. ,如果目标对象不可扩展(non-extensible),则defineProperty()不能增加目标对象上不存在的属性,否则会报错。另外,如果目标对象的某个属性不可写(writable)或不可配置(configurable),则defineProperty()方法不得改变这两个设置。
getOwnPropertyDescriptor()方法拦截Object.getOwnPropertyDescriptor()
1. getPrototypeOf()用来拦截获取对象原型
2. 拦截这些操作
Object.prototype.__proto__
Object.prototype.isPrototypeOf()
Object.getPrototypeOf()
Reflect.getPrototypeOf()
instanceof
3. 如果目标对象不可扩展(non-extensible), getPrototypeOf()方法必须返回目标对象的原型对象。
1. isExtensible()方法拦截Object.isExtensible()操作。
2. 这个方法有一个强限制,它的返回值必须与目标对象的isExtensible属性保持一致,否则就会抛出错误。
Object.isExtensible(proxy) === Object.isExtensible(target)
1. ownKeys()方法用来拦截对象自身属性的读取操作
2. 拦截以下操作
Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Object.keys()
for...in循环