Javascript 中的虚拟 Getter 和 Setter 是什么?
What is a Virtual Getter and Setter in Javascript?
虚拟 getter 和 setter 背后的想法是什么?
为什么我们需要它们?
我边看教程边写了下面的代码:
login: async args => {
const user = await User.findOne(args.email)
if (!user) {
throw new Error("Email doesn't exist!")
}
const isEqual = await bcrypt.compare(args.password, user.password)
if (!isEqual) {
throw new Error("Wrong Password!")
}
jwt.sign({userId: user.id})
}
我在这里使用虚拟 getter 来提取 user.id
但我不太明白这里发生了什么。
我正在使用 Mongoose。
这里没有 "going on",您得到的是 user
的 id
属性。
"Virtual attributes"(无论如何在 JS 中通常定义)是一个 属性, 看起来 像一个属性,但可以计算(通过设置,得到,或两者兼而有之)。
如果你想在设置或获取 属性 时针对 "need" 的各种值执行额外的逻辑,你 "need" 他们:你永远 不需要 他们,但你可能 想要 他们——有时他们很棒。
超过使用getters/setters有潜在的缺点,比如(至少AFAIK)你不能制作吸气剂或setters async
,这在某些情况下可能会有问题,例如,Mongoose 的 set
接受一个函数,该函数将被转换为 属性 setter,但您不能使其异步: https://github.com/Automattic/mongoose/issues/2571
的 MDN 文档链接
您可以将其视为将 属性 包装在一个函数中,其中 属性 的名称成为函数的名称,而 属性 的值就是return编辑。这样你就可以在 returning 之前操作输出。
假设您的 ID 属性 存储为字符串,但您需要 return 一个数字。在getter中,你可以这样写:
get id() {
return parseInt(this.id);
}
同理,使用setter,你可以将数字转换为字符串并添加前缀:
set id(newId) {
this.id = "ID_" + newId.toString();
}
虚拟 getter 和 setter 背后的想法是什么? 为什么我们需要它们?
我边看教程边写了下面的代码:
login: async args => {
const user = await User.findOne(args.email)
if (!user) {
throw new Error("Email doesn't exist!")
}
const isEqual = await bcrypt.compare(args.password, user.password)
if (!isEqual) {
throw new Error("Wrong Password!")
}
jwt.sign({userId: user.id})
}
我在这里使用虚拟 getter 来提取 user.id
但我不太明白这里发生了什么。
我正在使用 Mongoose。
这里没有 "going on",您得到的是 user
的 id
属性。
"Virtual attributes"(无论如何在 JS 中通常定义)是一个 属性, 看起来 像一个属性,但可以计算(通过设置,得到,或两者兼而有之)。
如果你想在设置或获取 属性 时针对 "need" 的各种值执行额外的逻辑,你 "need" 他们:你永远 不需要 他们,但你可能 想要 他们——有时他们很棒。
超过使用getters/setters有潜在的缺点,比如(至少AFAIK)你不能制作吸气剂或setters async
,这在某些情况下可能会有问题,例如,Mongoose 的 set
接受一个函数,该函数将被转换为 属性 setter,但您不能使其异步: https://github.com/Automattic/mongoose/issues/2571
您可以将其视为将 属性 包装在一个函数中,其中 属性 的名称成为函数的名称,而 属性 的值就是return编辑。这样你就可以在 returning 之前操作输出。
假设您的 ID 属性 存储为字符串,但您需要 return 一个数字。在getter中,你可以这样写:
get id() {
return parseInt(this.id);
}
同理,使用setter,你可以将数字转换为字符串并添加前缀:
set id(newId) {
this.id = "ID_" + newId.toString();
}