【问题标题】:Using prototype to store a property instead of getter in JavScript class在 JavaScript 类中使用原型存储属性而不是 getter
【发布时间】:2020-08-11 06:23:50
【问题描述】:

那么,我正在浏览 eloquent javascript 的 platform game 并且在这个类中,我们为什么要在原型中存储 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);

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

【问题讨论】:

  • 你不明白什么?它不是在每个对象中存储一个 size 属性,而是在原型中存储一次,所有实例都继承它。
  • 我不明白这一点:> 我们本可以使用类似 getter 的类型,但是每次读取属性时都会创建并返回一个新的 Vec 对象,这很浪费。
  • 每次调用new Vec() 都必须构造一个新的Vec 对象。由于它永远不会改变并且所有实例都是相同的,这将是多余的。
  • 返回字符串字面量没有开销,因为 JavaScript 编译器知道不需要构造任何内容。所以有get type的函数就OK了。
  • get size() { return new Vec(0.8, 1.5); }

标签: javascript class oop prototype


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多