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
相关产品推荐
相关产品推荐

