一个问题:谁说得对?
文章从一个同时包含属性、原型方法和两种实例方法的类出发,发现 GPT-4 对 makeAutoObservable 推断结果的回答和官方文档对不上,于是决定自己去验证。
官方文档的推断规则
自有属性成为 observable,getter 成为 computed,setter 成为 action,原型上的函数成为 autoAction,原型上的 generator 函数成为 flow。按这套规则,写成实例属性的方法会被标记为 observable。
从源码和实验两个角度验证
通过阅读简化后的源码,再编写三组测试,确认写成实例属性的方法确实被标记为 observable,官方文档的说法是正确的。
结论及推论
想获得 action 基于事务的批处理优化,方法必须写在原型上。原型方法的 this 指向问题可以用 makeAutoObservable(this, {}, { autoBind: true }) 解决,第三个参数的默认值是 { autoBind: false, deep: true }。