首页 > 解决方案 > 在 JavScript 类中使用原型存储属性而不是 getter

问题描述

所以,我正在通过 eloquent javascript 的平台游戏,在这个类中,我们为什么要size在原型中存储属性?

描述说:

所有 Player 实例的 size 属性都是相同的,因此我们将其存储在原型上而不是实例本身上。我们本可以使用类似 getter 的类型,但是每次读取属性时都会创建并返回一个新的 Vec 对象,这将是一种浪费。(字符串是不可变的,不必在每次评估时都重新创建。)

但我无法理解。帮帮我!

class Player {
  constructor(pos, speed) {
    this.pos = pos;
    this.speed = speed;
  }

  get type() { return "player"; }

  static create(pos) {
    return new Player(pos.plus(new Vec(0, -0.5)),
                      new Vec(0, 0));
  }
}

Player.prototype.size = new Vec(0.8, 1.5);

另外,如果有人完成了游戏,谁能告诉我 x 和 y 坐标是如何在new Vec(0.8, 1.5),new Vec(0, -0.5)new Vec(0, 0). 我很难理解。谢谢!

标签: javascriptclassoopprototype

解决方案


在原型上存储类似于其他语言(例如 Java)中的静态属性,这意味着只有一个 Vec 实例在所有 Player 实例之间共享。

当您访问任何播放器的属性时,iJavaScript 首先在播放器实例上查找常规属性,如果没有找到则查找类原型,然后查找父类原型,依此类推。

在这种情况下,它只是优化。不是为每个玩家创建 Vec 实例,而是在内存中只存在一个。换句话说,您可以将其视为恒定的。


推荐阅读