2021-11-27 学习计划与总结

95 阅读2分钟
  • 代理与反射看一半
  • 试一试 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()的一个使用场景是,目标对象不允许直接访问,必须通过代理访问,一旦访问结束,就收回代理权,不允许再次访问。