获取访问器是否会产生每个实例的分配成本?

Do get accessors incur a per-instance allocation cost?

假设我有一个 class 定义如下:

class Test {
  get a() { return 1; }
  get b() { return 2; }
  get c() { return 3; }
  get d() { return 4; }
  get e() { return 5; }
  get f() { return 6; }
  get g() { return 7; }
  get h() { return 8; }
}

然后我创建了几个这样的实例:

let a = new Test();
let b = new Test();
let c = new Test();

是否为每个实例分配了这些获取访问器?也就是说,如果我要添加更多的 get 访问器,这些对象中的每一个的内存使用量是否会增加,或者 get 访问器是否分配一次并在所有实例之间共享?

我尝试用 Chrome 的堆快照对其进行测试,它 似乎 就像我添加的内存使用量无关object 是相同的,但我不确定是否总是如此,或者在什么条件下它成立。

我想知道这个,因为我正在开发一个与内存分配相关的浏览器游戏。

(这里是 V8 开发人员。)与其他方法一样,访问器是按 class 存储的,而不是按实例存储的。只要按常规使用classes,就很难不小心弄错了。

当然,您可以通过在每个实例上显式存储函数实例来破坏此机制,例如如果您使用 traditional/ES5 非 class 构造函数并写入:

function MyObj {
  this.field = 42;
  this.method = function method(x) { ... }
}

var o1 = new MyObj();
var o2 = new MyObj();  // Fresh copy of `method`.

(当然,那时候建议用MyObj.prototype.method = function() {...}代替。)
对于 classes,如果您在构造函数中进行类似的赋值,您将获得相同的效果。