You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS中对象内置修改函数与外部修改函数的内存/性能差异

关于对象方法内存占用的疑问

我通过下面的方式创建大量对象:

function Bird() {
    this.prop1 = 1;
    this.prop2 = 2;

    ...
}

const bird1 = new Bird();
const bird2 = new Bird();

想请教:相较于使用单个外部函数,把相同函数嵌套在每个Bird对象内部会占用更多内存或资源吗?

内置函数实现方式

function Bird() {
    this.prop1 = 1;
    this.prop2 = 2;

    this.modFunc = function() {
        this.prop1 = this.prop1 * 10;
    }
}

const bird = new Bird();

bird.modFunc();

外部函数实现方式

function Bird() {
    this.prop1 = 1;
    this.prop2 = 2;
}

function modFunc(b) {
    b.prop1 = b.prop1 * 10;
}

const bird = new Bird();

modFunc(bird);

我只是出于学习目的问这个问题,目前没遇到需要考虑这种差异的场景,但如果要创建数百万甚至更多对象,哪种方式更有优势?

我个人认为外部函数更高效,因为在内置函数的实现里,我可以这样重写函数:

bird.modFunc = function() {...};

这是不是说明每个对象都有指向自身内置函数的独立引用?


回答
  • 内存占用差异:你的判断完全正确。当把函数定义在构造函数内部时,每创建一个Bird对象,就会生成一个全新的modFunc函数实例,每个对象都会持有这个独立函数的引用。而外部函数方式中,modFunc只存在一份,所有对象共享这同一个函数,内存占用会低很多——尤其是创建数百万对象时,这种内存差距会非常显著。
  • 性能与适用场景:如果要创建超大量对象,外部函数方式在内存和资源占用上更有优势,调用时也没有额外的函数实例化开销。不过内置方式也有好处:写法更贴合面向对象逻辑,能直接用this访问对象属性,而且每个对象的方法可以单独修改(就像你举例的重写bird.modFunc),灵活性更高。
  • 最优折中方案:其实还有第三种更常用的优化方式——把方法挂载到构造函数的原型上:
function Bird() {
    this.prop1 = 1;
    this.prop2 = 2;
}

Bird.prototype.modFunc = function() {
    this.prop1 = this.prop1 * 10;
}

const bird = new Bird();
bird.modFunc();

这种方式既保留了面向对象的写法(可以用this访问属性),又让所有Bird对象共享同一个原型上的modFunc函数,内存效率和外部函数方式一致,是JavaScript中实现类方法的标准做法。

内容的提问来源于stack exchange,提问作者Birrel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:35:11