假设我想使用随机数据库创建一个由Person组成的array.

我可以做一些类似的事情

import {generateRandom} from 'someLib'

let people = []

function getPerson() ({
  name: generateRandom.string()
  age: generateRandom.number()
})

for (let i = 0; i < 10; i++) {
  people.push(getPerson())
}

但我也可以做一些事情,比如

import {generateRandom} from 'someLib'

class Person {
  constructor() {
    this.name = generateRandom.string(),
    this.age = generateRandom.number()
  }
}

let people = []

for (let i = 0; i < 10; i++) { 
  people.push(new Person()) 
}

在记忆层面上,结果有什么不同吗?


(这只是一个理论问题,我并不是要解决什么特别的问题)

我找到了这个和这个Difference between creating a class in javascript to create an object and creating an class and object in Java有关的问题

这说明在JS中没有类.

这只是句法上的糖吗?两种做完全相同事情的方式?

推荐答案

如果您想自己判断内存,可以将此代码放入控制台:

class Test{};

const test = new Test();

class Class {};
test.Class = Class;
test.classObj = new Class();

function func() {return {};};
test.func = func;
test.funcObj = func();

使用Google Chrome开发工具拍摄堆快照,按构造函数排序,找到Test个类.

然后,您可以判断这些函数和对象的内存.以下是我得到的截图:

1st results

您可以看到,由类构造函数实例化的对象略大于由函数实例化的对象.展开原型,您可以看到它们都使用Object构造函数,但是classObj的原型链中有额外的Class构造函数.

您还可以看到,类构造函数似乎比常规函数保留了更多的内存,保留的大小意味着如果函数不再使用,将由垃圾回收清理的内存.

对于类构造函数,似乎有额外的172字节,对于空对象,每个对象有24字节.


在Vlaz的 comments 之后,下面是添加了10个方法和10个实例的结果.

class Test{};

const test = new Test();

class Class {
  method0(){};
  method1(){};
  method2(){};
  method3(){};
  method4(){};
  method5(){};
  method6(){};
  method7(){};
  method8(){};
  method9(){};
};
test.Class = Class;
for (let i=0; i < 10; i++){
  test["classObj" + i] = new Class();
}


function func0(){};
function func1(){};
function func2(){};
function func3(){};
function func4(){};
function func5(){};
function func6(){};
function func7(){};
function func8(){};
function func9(){};
function constructorFunc() {
  return {
    method0: func0,
    method1: func1,
    method2: func2,
    method3: func3,
    method4: func4,
    method5: func5,
    method6: func6,
    method7: func7,
    method8: func8,
    method9: func9,
  };
};
test.constructorFunc = constructorFunc;
for (let i=0; i < 10; i++){
  test["funcObj" + i] = constructorFunc();
}

all objects

expanded Class

类对象的浅层大小现在小得多.这似乎是因为他们可以只存储对类原型的引用,而不是直接引用他们的所有方法.

乍一看,保留的大小Class似乎小于constructorFunc,但扩展Class可以看到一个名为prototype的属性,它是一个保留了额外1.38KB的对象.将其与类本身的520B相加,将其推到constructorFunc的保留内存之上.但是,通过创建类的实例而不是对象来节省的内存将很快超过这一点.

因此,上课似乎是一条必经之路.

Javascript相关问答推荐

使用续集和下拉栏显示模型属性

未捕获错误:在注销后重定向到/login页面时找不到匹配的路由

如何在angular中从JSON值添加动态路由保护?

浮动Div的淡出模糊效果

Snowflake JavaScript存储过程返回成功,尽管预期失败

Chromium会将URL与JS一起传递到V8吗?

PDF工具包阿拉伯字体的反转数字

VUE 3捕获错误并呈现另一个组件

如何将多维数组插入到另一个多维数组中?

Next.js服务器端组件请求,如何发送我的cookie token?

为什么这个.add.group({})在教程中运行得很好,但在我的游戏中就不行了?

变量在导入到Vite中的另一个js文件时成为常量.

删除加载页面时不存在的元素(JavaScript)

如何修复错误&语法错误:不能在纯react 项目中JEST引发的模块&之外使用导入语句?

在此div中添加一个类,并在一段时间后在Java脚本中将其删除

如何使用useparams从react路由中提取id

使用重新 Select 和对象理解 Select 器备忘

如何在HTML中使用rxjs显示动态更新

如何在使用FOR AWAIT时从异步生成器中获取返回值

如何使用逗号JS从数组中输出数据列表?