简单对象与闭包的 JavaScript 存储大小

标签 javascript memory closures

假设我想要一个具有 2 个字段的对象,ab:

function createObject (a, b) {
    return { a: a, b: b };
}

但是如果我想控制访问,比如使其只读,我可以使用闭包:

function createObject (aParam, bParam) {
    var a = aParam, b = bParam;
    return {
        a: function () { return a; },
        b: function () { return b; }
    }
}

闭包方法需要多少额外存储空间?以这种方式创建的每个对象是否都有这两个访问函数的唯一副本?

最佳答案

它到底需要多少内存取决于引擎,但它必须存储闭包以及 getter 方法,这些方法会为创建的每个新实例进行复制。它还会减慢执行速度,因为每次您想要访问变量时都需要运行该方法,并且它使代码的可读性较差(您需要调用 .a() 而不是仅调用 . a 当你想要的时候就使用它)。

我不会使用它,因为没有什么可以阻止某人通过这样做来替换值:

obj = createObject('original', 'values');
obj.a(); // returns 'original'

obj.a = function() { return 'modified'; };
obj.a(); // returns 'modified'

顺便说一句,将参数名称放在括号中与在函数体内声明变量相同。换句话说,您的代码中不需要有 paramA 和 paramB 。效果很好:

function createObject (a, b) {
    return {
        a: function () { return a; },
        b: function () { return b; }
    }
}

没有完美的方法可以在 JS 中保护变量而不造成可怕的开销,因此最好的选择就是在私有(private)属性后面添加下划线前缀或后缀,就像在 python 中一样。我更喜欢使用前缀,这样当有人使用我制作的库时,私有(private)变量就不会显示在自动完成中。然后,您实际上可以在原型(prototype)中编写 getter 代码,因此该方法只有一份副本:

function Foo(a, b) {
    this._a = a;
    this._b = b;
}

Foo.prototype.getA = function() { return _a; };
Foo.prototype.getB = function() { return _b; };

这根本不会使 _a_b 变为私有(private),但它确实告诉任何使用您代码的人不应该访问它们。如果他们太笨了,不会破坏一切,那就不再是你的问题了。

关于简单对象与闭包的 JavaScript 存储大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33704690/

相关文章:

javascript - 使用 R 导出期刊文章的引文

javascript - 使内容可嵌入外部网站的良好做法/策略是什么?

debugging - 为什么 "garbage"数据看起来没有意义?

c# - 在创建时调用 Lambda

javascript - 用于匹配用户输入并转换为 Javascript 对象的正则表达式

javascript - 在 Node.js 中仅连接一次配置变量

c - 内核如何将进程限制在自己的内存池中?

performance - 使用 CUDA 尽可能快地访问只读全局数组?

sql - 什么是数据库关闭?

C++ 定义一个使用 lambda 闭包的函数