【发布时间】:2012-12-04 18:59:26
【问题描述】:
在 JavaScript 中,对象的字段始终是“公共的”:
function Test() {
this.x_ = 15;
}
Test.prototype = {
getPublicX: function() {
return this.x_;
}
};
new Test().getPublicX(); // using the getter
new Test().x_; // bypassing the getter
但您可以通过使用局部变量并使用闭包作为 getter 来模拟“私有”字段:
function Test() {
var x = 15;
this.getPrivateX = function() {
return x;
};
}
new Test().getPrivateX(); // using the getter
// ... no way to access x directly: it's a local variable out of scope
一个不同之处在于,使用“公共”方法,每个实例的 getter 都是同一个函数对象:
console.assert(t1.getPublicX === t2.getPublicX);
而在“私有”方法中,每个实例的 getter 都是一个不同的函数对象:
console.assert(t1.getPrivateX != t2.getPrivateX);
我很好奇这种方法的内存使用情况。由于每个实例都有一个单独的getPrivateX,如果我创建例如 10k 个实例,这会导致巨大的内存开销吗?
关于创建具有私有和公共成员的类实例的性能测试:
【问题讨论】:
-
公共和私有方法都是线性的 -
O(n)- 在资源消耗方面(只是C不同)。由于它最终是一个实现细节,因此了解它是否“[使用过多]内存开销”的唯一方法是运行一些测试。对于 已知 有 10k+ (100k+?) 个实例的对象,我会首先选择仅原型方法;这是我自己未经证实的“表现”强加。但同样,这都是线性增长。 -
(我投了赞成票,因为我认为从不同的 ECMAScript 实现获得经验证据的答案会很好。 )
-
@ruakh 你对命名是正确的,但这是公开私人成员的唯一方法。
标签: javascript