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",您得到的是 userid 属性。

"Virtual attributes"(无论如何在 JS 中通常定义)是一个 属性, 看起来 像一个属性,但可以计算(通过设置,得到,或两者兼而有之)。

如果你想在设置或获取 属性 时针对 "need" 的各种值执行额外的逻辑,你 "need" 他们:你永远 不需要 他们,但你可能 想要 他们——有时他们很棒。

超过使用getters/setters有潜在的缺点,比如(至少AFAIK)你不能制作吸气剂或setters async,这在某些情况下可能会有问题,例如,Mongoose 的 set 接受一个函数,该函数将被转换为 属性 setter,但您不能使其异步: https://github.com/Automattic/mongoose/issues/2571

setters and getters

的 MDN 文档链接

您可以将其视为将 属性 包装在一个函数中,其中 属性 的名称成为函数的名称,而 属性 的值就是return编辑。这样你就可以在 returning 之前操作输出。

假设您的 ID 属性 存储为字符串,但您需要 return 一个数字。在getter中,你可以这样写:

get id() {
    return parseInt(this.id);
}

同理,使用setter,你可以将数字转换为字符串并添加前缀:

set id(newId) {
    this.id = "ID_" + newId.toString();
}