- 代理与反射看一半
- 试一试 resnet 有无 attention 分别的效果
- 看看徐安得数学方法的论文
代理与反射
set
- 在给一个对象设置代理时,如果一个对象的属性时不可修改的
writable: false这种情况下,代理对象操作改属性不会起作用 - set 应该返回一个布尔值
has
如果一个对象时不可配置或者不可扩展的,那么代理一个对象时,拦截对象的 has 方法,就会报错
值得注意的是,has()方法拦截的是HasProperty操作,而不是HasOwnProperty操作,即has()方法不判断一个属性是对象自身的属性,还是继承的属性。
Object.preventExtensions(obj);
该 API 就是用来阻止对象扩展,换句话说就是不能再使用 Object.define 来配置对象的属性
constructor
- onstruct()
方法用于拦截new`命令 - 代理的构造函数中,必须要返回一个对象(下文中的return { value: args[0] * 10 }),否则报错
- construct 中的 his 指向的是代理对象
p
const p = new Proxy(function () {}, {
construct: function(target, args) {
console.log('called: ' + args.join(', '));
return { value: args[0] * 10 };
}
});
defineProperty
defineProperty()方法拦截了Object.defineProperty()操作。
deletProperty
deleteProperty方法用于拦截delete操作,如果这个方法抛出错误或者返回false,当前属性就无法被delete命令删除。
getOwnPropertyDescriptor
getOwnPropertyDescriptor()方法拦截Object.getOwnPropertyDescriptor(),返回一个属性描述对象或者undefined。
getPrototypeOf
getPrototypeOf会在访问代理对象的原型的时候进行拦截,并且返回值必须是对象或者是null
var proto = {};
var p = new Proxy(proto, {
getPrototypeOf(target) {
console.log(111111)
return proto.__proto__;
}
});
console.log(p.__proto__)
isExtensible()
isExtensible()方法拦截Object.isExtensible()操作。- 代理对象的返回值,必须要与原对象的
isExtensible()的返回值相同
ownKeys
ownKeys()方法用来拦截对象自身属性的读取操作。具体来说,拦截以下操作。
Object.getOwnPropertyNames()Object.getOwnPropertySymbols()Object.keys()for...in循环
preventExtensions
preventExtensions()方法拦截Object.preventExtensions()。该方法必须返回一个布尔值,否则会被自动转为布尔值。
setPrototypeOf
setPrototypeOf()方法主要用来拦截Object.setPrototypeOf()方法。
Proxy.revocable
Proxy.revocable()方法返回一个可取消的 Proxy 实例。
Proxy.revocable()的一个使用场景是,目标对象不允许直接访问,必须通过代理访问,一旦访问结束,就收回代理权,不允许再次访问。