如果您想自己判断内存,可以将此代码放入控制台:
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
个类.
然后,您可以判断这些函数和对象的内存.以下是我得到的截图:
您可以看到,由类构造函数实例化的对象略大于由函数实例化的对象.展开原型,您可以看到它们都使用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();
}
类对象的浅层大小现在小得多.这似乎是因为他们可以只存储对类原型的引用,而不是直接引用他们的所有方法.
乍一看,保留的大小Class
似乎小于constructorFunc
,但扩展Class
可以看到一个名为prototype
的属性,它是一个保留了额外1.38KB的对象.将其与类本身的520B相加,将其推到constructorFunc
的保留内存之上.但是,通过创建类的实例而不是对象来节省的内存将很快超过这一点.
因此,上课似乎是一条必经之路.