可能是重复问题:
在纯JavaScript中是否可以实现只读属性?
我有一个对象,希望只能在构造时定义。如何防止该对象引用被更改?
可能是重复问题:
在纯JavaScript中是否可以实现只读属性?
我有一个对象,希望只能在构造时定义。如何防止该对象引用被更改?
在当前普遍可用的实现中,ECMAScript 3没有真正支持不变性。
更新:现在,ECMAScript 5标准得到广泛支持。它新增了Object.seal
和Object.freeze
方法。
Object.seal
方法将防止属性添加,但仍允许用户编写或编辑现有属性。
Object.freeze
方法将完全锁定对象。对象将完全保持冻结状态。一旦对象被冻结,就无法解冻。
更多信息:
Object.freeze
仅在当前对象级别中起作用,设置自有属性不可配置和不可写,并防止进一步扩展(添加新属性)。您可以在规范的以下部分检查冻结的内部:https://cms.gt/P7NKq - Christian C. Salvadó编辑:这是十年前写的。我不认为这是一个最新的答案。
实际上...通过不覆盖它来控制访问。您可以始终通过将其包装在仅提供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
... - Christian C. Salvadófunction (obj) { return $.extend({}, obj); }
- crush