关于JavaScript中关闭/封装效率的问题

GRa*_*rdB 8 javascript oop performance closures

我对JavaScript很新,所以如果这是一个愚蠢的问题请耐心等待.

假设我有一个看起来像这样的"类":

var obj = function () {
    var val;
    return {
        setVal: function(newVal) {
            val = newVal;
        },
        getVal: function() {
            return val;
        }
    };
};
Run Code Online (Sandbox Code Playgroud)

假设我的语法是正确的,这将定义一个具有名为"value"的"私有"属性的类,其中包含设置/获取属性的方法.现在,我将从这个类创建两个对象:

var myObj = obj();
var yourObj = obj();
Run Code Online (Sandbox Code Playgroud)

这是为每个对象创建一个单独的setVal()和getVal()方法吗?如果没有,为什么不呢?如果是这样,在构建高效的Web应用程序时这是一个严重问题吗?在大多数/所有情况下,关闭效率的权衡(如果有的话)是否值得?我笨吗?

谢谢,杰拉德

Dom*_*nic 0

它在概念上确实是这样做的。然而,由于这是一种常见的模式,现代 JavaScript JITers 知道如何优化它,以便内存中只存储一份代码副本,并通过适当的指针重定向使其与相关闭包一起工作。

编辑:虽然我不太愿意通过源代码进行探索,但这里有一些基本的证据。下载 Chrome 开发通道版本,并在运行以下代码之前和之后拍摄堆快照:

var obj = /* as above */;

var objs = [];
for (var i = 0; i < 10000; ++i) {
    objs.push(obj());
}
Run Code Online (Sandbox Code Playgroud)

然后对此代码执行相同操作:

function Obj() { }
Obj.prototype.setVal = function (value) { this._val = value; };
Obj.prototype.getVal = function () { return this._val; };

var objs = [];
for (var i = 0; i < 10000; ++i) {
    objs.push(new Obj());
}
Run Code Online (Sandbox Code Playgroud)

您会发现堆快照在两种情况下都显示相同的“代码”数字,因此实际上正在执行我描述的优化。