我创建了一个UserSchema
,并添加了一种方法来尝试设置其属性name
:
import mongoose, { Schema } from 'mongoose'
const UserSchema = new Schema({
name: String
})
UserSchema.methods.setName = (name) => {
this.name = name + '123'
}
exports default mongoose.model('User', UserSchema)
我导入了对象,并从我创建的控制器中调用了方法:
import User from './User'
exports.signup = (request, response) => {
const name = 'Ignas'
const UserModel = new User
UserModel.setName(name)
...
}
由于某种原因,它引发了一个错误:
TypeError:无法设置未定义的属性“名称”
如何this
未定义?
如果我修改传递对象的方法,则可以使它按我的意愿工作,但是它看起来很脏而且不正确,因为我要做的就是通过对象的方法更改对象的属性。
// modified method of Schema
UserSchema.methods.setName = (User, name) => {
User.name = name + '123'
}
// modified call from the controller
UserModel.setName(name)
答案 0 :(得分:1)
箭头功能不绑定自己的this
。他们使用 lexical this
。箭头函数按词法绑定它们的上下文,因此this
实际上是指原始上下文。这称为词汇作用域。词汇作用域意味着什么:
词汇范围(有时也称为静态范围)是一种惯例 与许多设置范围(范围 功能),以便只能调用它 (引用)来自定义它的代码块。
例如,您在MDN中有关于此问题的更多说明。
最后,发生的事情是它将在所有父级的上下文中寻找this
直到找到为止,在您的情况下,因为在模块中没有this
的定义在任何地方返回undefined
。
答案 1 :(得分:0)
您使用Arrow function
语法,带有箭头功能的this
关键字有些混乱。
修补程序:使用旧式函数语法
UserSchema.methods.setName = function(name) {
this.name = name + '123'
}