【发布时间】:2011-01-26 13:41:34
【问题描述】:
【问题讨论】:
标签: javascript object reference readonly
【问题讨论】:
标签: javascript object reference readonly
在当前广泛使用的实现中,ECMAScript 3 不支持真正的不变性。
更新:如今,ECMAScript 5 标准得到广泛支持。它添加了Object.seal 和Object.freeze 方法。
Object.seal 方法将阻止属性添加,仍然允许用户写入或编辑现有属性。
Object.freeze 方法将完全锁定一个对象。当您冻结对象时,对象将保持原样。一旦对象被冻结,就不能解冻。
更多信息:
【讨论】:
Object.freeze 将仅在当前对象级别中起作用,将自己的属性设置为不可配置和不可写,并防止进一步扩展(添加新属性)。您可以在规范的以下部分检查冻结的内部结构:cms.gt/P7NKq
编辑:这是 10 年前写的。我不认为这是一个最新的答案。
实际上...通过不覆盖它。您始终可以通过将其包装在一个仅提供 GetObj 而没有 SetObj 的对象中来控制访问,但当然,包装器同样容易被覆盖,其“私有”成员属性也是如此,这些属性将通过 GetObj 方法“隐藏”。
其实问题是骗人的:
Can Read-Only Properties be Implemented in Pure JavaScript?
编辑:
阅读http://javascript.crockford.com/private.html 之后,可以使用闭包来创建外部世界真正无法访问的变量引用。例如:
function objectHider(obj)
{
this.getObject=function(){return obj;}
}
var someData={apples:5,oranges:4}
var hider=new objectHider(someData);
//... hider.getObject()
objectHider 中对 obj 的引用不能在对象创建后修改。
我正在尝试为此考虑一个实际用途。
【讨论】:
hider.getObject只是返回一个someData对象的引用,它可以被修改,例如:hider.getObject().apples = 0;然后hider.getObject();会返回相同的修改对象,因为hider.getObject() == someData...
function (obj) { return $.extend({}, obj); }