咨询Mongoose链式方法中this变量的上下文与使用目的
this上下文和用途 这是个很典型的Mongoose使用问题,咱们一步步拆解清楚:
this的上下文是什么?
在你这段代码里,虚拟属性的get和set方法用的都是普通函数(不是箭头函数),这里的this指向的是当前的Mongoose文档实例——也就是你从数据库查询出来、或者新建的那个Person对象。Mongoose在调用这些getter/setter的时候,会自动把文档实例绑定到函数的this上,让你能直接操作这个实例的属性。
要是换成箭头函数就不行了,箭头函数的this会继承外层作用域的上下文(比如定义这个Schema时的模块环境),根本拿不到文档实例,所以这里必须用普通函数。
使用this的目的是什么?
1. 在getter里:读取当前实例的属性
get函数的作用是返回虚拟属性name.full的值,通过this我们可以访问当前文档实例的name.first和name.last属性,把它们拼接成完整的姓名返回。比如当你执行person.name.full时,这个getter就会触发,this就是那个person实例,能直接拿到它的名字片段。
2. 在setter里:修改当前实例的属性
set函数是当你给name.full赋值时触发的(比如person.name.full = "Alice Brown")。这里的this还是当前的文档实例,我们用this.set()方法来更新实例里的name.first和name.last属性——这样修改会被Mongoose的变更跟踪机制记录下来,之后调用person.save()时,这些修改会同步到数据库里。
举个实际使用的例子更直观:
// 创建一个Person实例 const person = new Person({ name: { first: "Jane", last: "Smith" } }); console.log(person.name.full); // 输出 "Jane Smith" // 给虚拟属性赋值,触发setter person.name.full = "John Doe"; console.log(person.name.first); // 输出 "John" console.log(person.name.last); // 输出 "Doe" // 保存到数据库,修改会被同步 await person.save();
简单来说,this就是Mongoose给你搭的桥,让你能在虚拟属性的逻辑里直接操作当前的文档实例,实现属性的动态计算和反向赋值~
内容的提问来源于stack exchange,提问作者Binh Le

