说我想要一个包含2个字段的对象, a 和 b :
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; }
}
}
关闭方法需要多少额外的存储空间?以这种方式创建的每个对象是否都拥有这两个访问函数的唯一副本?
答案 0 :(得分:2)
它需要多少内存取决于引擎,但它必须存储闭包以及getter方法,这些方法会为每个创建的新实例复制。它还会降低执行速度,因为每次要访问变量时都需要运行该方法,这会降低代码的可读性(当您想要使用时,需要调用cin >>
而不是.a()
它)。
我不会使用它,因为没有什么能阻止某人通过这样做来替换值:
.a
顺便说一下,将参数名称放在括号中与在函数体内声明变量相同。换句话说,您不需要在代码中使用paramA和paramB。这很好用:
obj = createObject('original', 'values');
obj.a(); // returns 'original'
obj.a = function() { return 'modified'; };
obj.a(); // returns 'modified'
没有完美的方法可以保护JS中的变量而不会产生可怕的开销,所以最好的办法就是在下划线中加上一个下划线前缀或后缀私有属性,就像在python中一样。我更喜欢使用前缀,因此当有人使用我制作的库时,私有变量不会出现在自动完成中。然后你可以在原型中实际编写getter代码,因此该方法只有一个副本:
function createObject (a, b) {
return {
a: function () { return a; },
b: function () { return b; }
}
}
这根本不会使function Foo(a, b) {
this._a = a;
this._b = b;
}
Foo.prototype.getA = function() { return _a; };
Foo.prototype.getB = function() { return _b; };
或_a
变为私有,但它确实告诉任何人使用您的代码,他们不应该访问它们。如果他们太愚蠢而不是打破一切,那就不再是你的问题了。