如何使变量/对象在 Javascript 中只读? [复制]
Posted
技术标签:
【中文标题】如何使变量/对象在 Javascript 中只读? [复制]【英文标题】:How can you make a variable/Object read only in Javascript? [duplicate] 【发布时间】:2011-01-26 13:41:34 【问题描述】:可能重复:Can Read-Only Properties be Implemented in Pure javascript?
我有一个我只想在构造时定义的对象。如何防止对象引用被更改?
【问题讨论】:
***.com/questions/366047/… 【参考方案1】:在当前广泛使用的实现中,ECMAScript 3 不支持真正的不变性。
更新:如今,ECMAScript 5 标准得到广泛支持。它添加了Object.seal
和Object.freeze
方法。
Object.seal
方法将阻止属性添加,仍然允许用户写入或编辑现有属性。
Object.freeze
方法将完全锁定一个对象。当您冻结对象时,对象将保持原样。一旦对象被冻结,就不能解冻。
更多信息:
ECMAScript 5 Objects and Properties【讨论】:
如果你创建了一个返回 Object.freeze(theObject) 的 getter 函数,那么在使用 getter 时就不可能改变原始对象的值。 Object.freeze 会递归冻结所有属性还是仅冻结对象拥有的(***)属性? @MrCholo,Object.freeze
将仅在当前对象级别中起作用,将自己的属性设置为不可配置和不可写,并防止进一步扩展(添加新属性)。您可以在规范的以下部分检查冻结的内部结构:cms.gt/P7NKq
Object.seal 和 Object.freeze 现在都得到了很好的支持。【参考方案2】:
编辑:这是 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
...
当然,但它是同一个对象。我只声称对它的引用是不可改变的,而不是它的属性。现在,如果 someData 也实现了隐藏技术...?
您需要创建对象的深层副本才能使其工作。可以使用 jQuery 的扩展来做到这一点:function (obj) return $.extend(, obj);
以上是关于如何使变量/对象在 Javascript 中只读? [复制]的主要内容,如果未能解决你的问题,请参考以下文章